C++ 成员函数与成员变量的关系

在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;
}

这是因为,成员函数是属于类的,而成员变量是属于对象的。
成员函数和普通函数没有本质什么区别,都是直接调用函数的,只是比普通函数多了一个 this 指针而已。如果成员函数里面没有使用这个 this 指针(也就是没有使用任何成员变量),那么 this 指针的值为多少就无所谓了,不管他是随机值或是 NULL.
只用通过指针调用虚函数才会通过对象的虚函数表去查找函数的地址,这时指针无效就会出问题了。
在上面代码中,int* p;到底有没有在堆空间开辟一个4字节大小的内存空间呢?
没有,这是在栈内定义的一个指针,所以是在栈内开辟了一个4字节大小的内存空间(用来放指针变量了)。
与此对应的,int* p = new int;是在栈上开辟了4个字节放指针,又在堆上开辟了4个字节(准备)放int变量

函数之所以会调用成功,是因为利用指针调用类的成员函数时,只跟指针的类型有关,而与其所指内容无关,也就是说只要指针类型是这个类的指针,那就可以用它来调用这个类的成员函数。如果这个函数做的事情跟类对象无关,就像你只返回一个常数,那这个函数看起来是正常运行的,但如果在类里访问了类的成员变量(比如返回x),那就会出错,因为此时要根据指针所指的内容去访问对应的成员变量,而指针实际上没有指向正确的地方,所以会出现内存访问错误。

猜你喜欢

转载自blog.csdn.net/qq_30366449/article/details/78402419