永发信息网

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

答案:6  悬赏:60  手机版
解决时间 2021-01-26 13:53
class Base
{
public:
void fun3(void)
{
cout <<"Base fun3"< }
};
Base *pBase = NULL;

pBase->fun3();

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

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

你可以尝试一下把fun3改成虚拟函数(virtual),这样调用过程就变成动态绑定,它就会出错了
全部回答
C++为空的类在实例化时会占用一个字节的内存填充类型为char,这是为了给类实体一个地址,所以pBase地址不会为0x00000000的 你可以搜索一下有关空类实例化的文章,会有详细解释的
因为函数里面没有调用任何成员变量,所有类实例共享同一成员函数地址,也就是这个函数地址从编译完就不会再变了,类实例化只是实例化成员变量而已。所以跟调用一个函数一样,但是如果里面调用了成员变量就会出错。
1. test是栈对象,不需要显示的初始化,会默认调tclass的构造函数。 2. pt是堆对象,需要显示的初始化,不会自动调tclass的构造函数。 3. 正确的方式如下: int main() { tclass test; tclass *pt = new tclass(); pt->x = 100; pt->y = 200; pt->print(); test.x = 150; test.y = 450; test.print(); cout << "x+y=" << add(&test); return 0; }
引用smile5201314Y的回答 pBase虽然为空  可他仍然是 Base的对象 既然是Base的对象 当然可以访问Base的成员了 但是空指针对象却不可以访问内存,一旦访问内存就会出现空指针错误! 例如: #include  using namespace std; class Base { private:     int data; public:     Base()     {         data = 0;     }     void fun3(void)     {         cout <<"Base fun3"<fun3();     return 0; }
这与类名调用函数是一样的 与对象无关 哦 错了 只有静态函数才可以 好像是这样 主动使用一个类时,类就会加载到内存中 包括类的静态成员,和方法(静态和非静态都会加载) 如此,我们声明一个类指针时,类就会被加载 所以即使是一个空指针,但访问的是类的方法。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
深蓝色牛仔裤怎样洗成淡蓝色
白领假日宾馆地址有知道的么?有点事想过去
2.5A 125V和2.5A 250V 充电时的区别
洛克王国的光明之蛋孵出固执的性格好吗
再生方时尚酒店怎么去啊,我要去那办事
【自由精神】1、道家的自由精神体现在哪里?你
如何计算光源光谱功率分布的误差
一人投资120万一人投资115万怎么分红
参加奥运不获奖牌的中国选手可提前回国吗?
布丁和紫仓是一个品种的吗?能否交配?应注意哪
突然发现诛仙辰皇的存照基本不出爆不知道为什
成语养生之道的意思是什么啊?有知道释义的请
吟江宾馆怎么去啊,我要去那办事
近几年我国汽车工业迅速发展,已成为我国工业
食用油里面有洗衣液还能吃吗
推荐资讯
菜鸟驿站(后沙峪镇吉祥花园小区吉鸿超市)地址
请教高手:纺纱中,多少支纱织几针布片怎么算
题目:一场春雨要求:一年四季都有雨春天的两
现代技术革命的主要标志是什么,期间经历了哪
玉川江湖箱子哪在哪爆的
【d291】口径D480*10D291*6换成DN表示都是多
古诗文默写。(5分,每空1分)(1)间关莺语花
结婚时我老公把户口迁到我家,婚后想迁回原地
c 反应蛋白焱见到103了怎么办且高烧不退
急知答案!!!白芷,益母草,马齿苋能配伍服用吗?
配合尺寸Φ30H8g7表示的意义包括 A间隙配合 B
某些肿瘤细胞分泌免疫抑制因子FasL以抵抗人体
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?