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

classBase{public:voidfun3(void){cout<<"Basefun3"<<endl;}};Base*pBase=NULL;pBase->fun3... class Base
{
public:
void fun3(void)
{
cout <<"Base fun3"<<endl;
}
};
Base *pBase = NULL;

pBase->fun3();

为什么可以运行呢???
展开
 我来答
空雪梦见
2013-10-23 · TA获得超过5598个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1202万
展开全部
我这么说吧。因为fun3函数里没有直接或间接用到this指针。
什么叫直接?你写了 this 在里面,并且这个this被访问了。
什么叫间接?你没直接写 this 但是用了成员变量等。

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

你可以尝试一下把fun3改成虚拟函数(virtual),这样调用过程就变成动态绑定,它就会出错了
bdlanyu
2013-10-23 · TA获得超过550个赞
知道小有建树答主
回答量:378
采纳率:0%
帮助的人:525万
展开全部
这与类名调用函数是一样的
与对象无关
哦 错了 只有静态函数才可以
好像是这样
主动使用一个类时,类就会加载到内存中
包括类的静态成员,和方法(静态和非静态都会加载)
如此,我们声明一个类指针时,类就会被加载
所以即使是一个空指针,但访问的是类的方法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
心中风情4
2013-10-23 · TA获得超过2247个赞
知道大有可为答主
回答量:1779
采纳率:66%
帮助的人:1084万
展开全部

引用smile5201314Y的回答

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


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

例如:

#include <iostream>
using namespace std;

class Base
{
private:
    int data;

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

    pBase->fun3();
    return 0;
}
追问
我不明白的是为什么Base *pBase = NULL就实例化了一个空对象,并没有new,仅仅是声明一个指针而已啊
追答
Base *pBase = NULL
我以为并没有“实例化”一个空对象,但这与pBase是Base的对象并不矛盾,编译器编译处理时候会为pBase绑定一个类,因此它就成这这个类的一个对象了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
欢乐多Ek
2013-10-23 · TA获得超过478个赞
知道小有建树答主
回答量:477
采纳率:0%
帮助的人:417万
展开全部
因为函数里面没有调用任何成员变量,所有类实例共享同一成员函数地址,也就是这个函数地址从编译完就不会再变了,类实例化只是实例化成员变量而已。所以跟调用一个函数一样,但是如果里面调用了成员变量就会出错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-10-23
展开全部
C++为空的类在实例化时会占用一个字节的内存填充类型为char,这是为了给类实体一个地址,所以pBase地址不会为0x00000000的

你可以搜索一下有关空类实例化的文章,会有详细解释的
更多追问追答
追问
那你的意思 Base *pBase = NULL;就实例化了一个空对象么?没有new啊

只是声明一个指针而已
追答
但是虽然内容为空,但是他依然是这个类的一个实例,是实例就可以调用其函数,与内容无关
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式