#include <iostream>
using namespace std;
class A {
int a;
int b;
public:
void print(){
cout << "abcd";
}
void print_a(){
cout << a << endl;
}
};
int main(void) {
A *a = NULL;
a->print(); //可以运行
a->print_a();//出现段错误
return 0;
}
暂时理解为以下:
可以参考python的方法来进行理解:
python 定义一个成员函数的方法为:print(self)
而通过对象调用该函数的时候通过a.print()来调用。也就是将对象a传入到print的self参数中。
再转回来:
c++中,每个对象都拥有一份独立的成员变量空间。而对于成员函数,并不是每个对象都拥有一份成员函数体而是所有的对象共用一份成员函数,程序编译之后,成员函数的地址就已经确定。成员函数的非虚函数由调用该函数的对象类型或者指针类型决定调用基类还是子类的函数块,然后直接进行调用,如果该函数用到了对象的成员变量,那么当遇到该变量时,将该变量自动转换为this->变量。
这是整个调用过程。
那么对于上述问题,指向空的对象指针,是可以调用该类的非静态且不包含成员变量的函数(不需要this指针)。然而当遇到成员变量后,调用该对象的this指针,为空,会出现段错误。
暂时做一下笔记,发现一篇博客比我这个解释清楚多了,介绍给大家:http://blog.csdn.net/starlee/article/details/2062586