ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

类nullptr指针指向成员函数

2022-09-13 22:32:35  阅读:198  来源: 互联网

标签:调用 虚表 函数 指向 成员 nullptr 地址 指针


C++空指针可以调用类成员函数,但是【不能调用】类中的【虚函数】

   

一个对象的指针可以调用它的成员函数和虚函数,

那么如果一个指向空nullptr的指针,能不能调用它的成员函数和虚函数。

   

   

   

```

#include<iostream>

using namespace std;

   

class A

{

public:

void func1()

{

//_a = 1;

}

virtual void func2()

{

   

}

private:

int _a = 10 ;

};

   

int main()

{

A *p = nullptr;

p->func1();

p->func2();

system("pause");

return 0;

}

```

   

   

   

问题一:空指针为什么能调用成员函数?

   

对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。当调用p->func1(); 这句话时,其实就是调用A::func1(this);而成员函数的地址在编译时就已经确定, 需要注意的是,你用空指针调用成员函数,只是让this指针指向了空,所以空指针也是可以调用普通成员函数,只不过此时的this指针指向空而已,但函数fun1函数体内并没有用到this指针,所以不会出现问题。

当成员函数体内用到this指针时,如果你的this指针是空,那么程序就会崩溃。比如,如果把 _a=1; 这句话放开,程序就会出问题,原因就是this指针指向空,当进行赋值的时候,编译器不知道这个成员变量是哪一个对象的,所以他不知道给哪个对象的_a赋值,因此就会出错。

   

   

   

   

问题二:空指针为什么不能调用虚函数?

   

我们知道,如果一个类中包含虚函数,那么他所实例化处的对象的前四个字节是一个虚表指针,这个虚表指针指向的是虚函数表。当然,虚函数的地址也是在编译时就已经确定了,这些虚函数地址存放在虚函数表里面,而虚函数表就在程序地址空间的数据段(静态区),也就是说虚表的建立是在编译阶段就完成的;当调用构造函数的时候才会初始化虚函数表指针,即把虚表指针存放在对象前四个字节(32位下)。试想一下,假如用空指针调用虚函数,这个指针根本就找不到对应的对象的地址,因此他也不知道虚表的地址,没有虚表的地址,怎么能调用虚函数呢。

   

Form https://blog.csdn.net/qingtu11/article/details/118976724

标签:调用,虚表,函数,指向,成员,nullptr,地址,指针
来源: https://www.cnblogs.com/libxing/p/16691151.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有