c++中空指针对象访问成员问题

2025-02-24 11:29:56
推荐回答(5个)
回答1:

我这么说吧。因为fun3函数里没有直接或间接用到this指针。
什么叫直接?你写了 this 在里面,并且这个this被访问了。
什么叫间接?你没直接写 this 但是用了成员变量等。

因为C++编译的时候,fun3是静态绑定的,所以运行的时候没有“查找对象上的fun3函数”的过程,对象有没有存在也不影响。

你可以尝试一下把fun3改成虚拟函数(virtual),这样调用过程就变成动态绑定,它就会出错了

回答2:

这与类名调用函数是一样的
与对象无关
哦 错了 只有静态函数才可以
好像是这样
主动使用一个类时,类就会加载到内存中
包括类的静态成员,和方法(静态和非静态都会加载)
如此,我们声明一个类指针时,类就会被加载
所以即使是一个空指针,但访问的是类的方法。

回答3:

引用smile5201314Y的回答

pBase虽然为空  可他仍然是 Base的对象 既然是Base的对象 当然可以访问Base的成员了


但是空指针对象却不可以访问内存,一旦访问内存就会出现空指针错误!

例如:

#include 
using namespace std;

class Base
{
private:
    int data;

public:
    Base()
    {
        data = 0;
    }
    void fun3(void)
    {
        cout <<"Base fun3"<    }
};
     
int main() {
    Base *pBase = NULL;

    pBase->fun3();
    return 0;
}

回答4:

因为函数里面没有调用任何成员变量,所有类实例共享同一成员函数地址,也就是这个函数地址从编译完就不会再变了,类实例化只是实例化成员变量而已。所以跟调用一个函数一样,但是如果里面调用了成员变量就会出错。

回答5:

C++为空的类在实例化时会占用一个字节的内存填充类型为char,这是为了给类实体一个地址,所以pBase地址不会为0x00000000的

你可以搜索一下有关空类实例化的文章,会有详细解释的