注册 登录
编程论坛 C++教室

关于静态成员函数的一个问题,请大佬帮我看看。

Theblueman 发布于 2018-04-09 15:05, 1646 次点击
#include<iostream>
#include<string.h>
using namespace std;
class student
{
private:
    static int total;
    int num;
    char name[20];
public:

    student(){total++;}
    ~student(){total--;}
    student(int n,const char *p="wang");
    void getname();
    int getnum();
    static void Print();
};
int student::total=0;
student::student(int n,const char *p)
{
    num=n;
    strcpy(name,p);
    total++;
}
void student::getname()
{
    cout<<name<<endl;
}
int student::getnum()
{
    return num;
}
void student::Print()
{
    cout<<"The number of all students:"<<total<<endl;
}
int main()
{
    student::Print();
    student *P=new student(13);
    student::Print();
    P->Print();
    delete P;
    P->Print();         //????????          
    student s[2];
    student::Print();
    s[1].Print();
      return 0;
}
问:为什么对象指针P被释放后,还能正确调用静态成员函数?      
7 回复
#2
rjsp2018-04-09 15:25
首先,你这是 static成员,P->Print()其实就是student::Print(),与P是什么值毫无关系。

再者,即使Print不是static成员,P->Print()也是可以调用的,只要不存取P指向的成员。
#3
Jonny02012018-04-09 18:09
static 属于所有同类别共用, 和删不删除指针没有关系

已经删除的指针仍然可以访问到数据, 这个要看具体的编译器, 在某些编译器上, 即时你已经释放了, 仍然可以通过已经释放的地址访问到原来存储的数据
这是因为指针被释放了, 而数据并没有从相关内存上清除
但是这种行为属于严重的程序设计错误, 在 C++ 中, 访问已经释放的指针是未定义行为, 不同的编译器可能有不同的处理方法
你现在的编译器可以正常输出, 不代表你这段代码到了别的编译器上也可以正常输出
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2018-4-9 18:11编辑过]

#4
Theblueman2018-04-09 21:59
回复 3楼 Jonny0201
哦,明白了,谢谢(能顺便问一下截图里使用的是什么软件吗?)
#5
Theblueman2018-04-09 22:04
回复 2楼 rjsp
用dev试了一下,确实可以,但是最后一句“只要不存取P指向的成员”还是不清楚(是给P赋值吗?)
#6
rjsp2018-04-10 08:24
回复 5楼 Theblueman
#include <iostream>
using namespace std;

class foo
{
public:
    foo() : val()
    {
    }

    void bar()
    {
        cout << this << endl;
    }

private:
    int val;
};

int main( void )
{
    foo* p = NULL;
    p->bar();

    return 0;
}

#7
Theblueman2018-04-10 12:56
回复 5楼 Theblueman
静态与非静态的最关键的区别就是那个this指针(看了csdn的博客)
#8
Jonny02012018-04-10 14:02
回复 4楼 Theblueman
CLion
1