在C++中,
#include <iostream>
using namespace std;
struct Data{
int x = 10;
int y() { return 20; }
};
int main()
{
Data* p=NULL; // 不用 new 创建指针
cout<<p->x<<endl; //抛出异常
cout<<p->y()<<endl; //程序能正常输出20
return 0;
}
函数之所以会调用成功,是因为利用指针调用类的成员函数时,只跟指针的类型有关,而与其所指内容无关,也就是说只要指针类型是这个类的指针,那就可以用它来调用这个类的成员函数。如果这个函数做的事情跟类对象无关,就像你只返回一个常数,那这个函数看起来是正常运行的,但如果在类里访问了类的成员变量(比如返回x),那就会出错,因为此时要根据指针所指的内容去访问对应的成员变量,而指针实际上没有指向正确的地方,所以会出现内存访问错误。