c++中空指针对象访问成员问题
解决时间 2021-01-26 13:53
- 提问者网友:沉默菋噵
- 2021-01-26 04:28
class Base
{
public:
void fun3(void)
{
cout <<"Base fun3"< }
};
Base *pBase = NULL;
pBase->fun3();
为什么可以运行呢???
最佳答案
- 五星知识达人网友:雾月
- 2021-01-26 06:07
我这么说吧。因为fun3函数里没有直接或间接用到this指针。
什么叫直接?你写了 this 在里面,并且这个this被访问了。
什么叫间接?你没直接写 this 但是用了成员变量等。
因为C++编译的时候,fun3是静态绑定的,所以运行的时候没有“查找对象上的fun3函数”的过程,对象有没有存在也不影响。
你可以尝试一下把fun3改成虚拟函数(virtual),这样调用过程就变成动态绑定,它就会出错了
全部回答
- 1楼网友:蕴藏春秋
- 2021-01-26 10:06
C++为空的类在实例化时会占用一个字节的内存填充类型为char,这是为了给类实体一个地址,所以pBase地址不会为0x00000000的
你可以搜索一下有关空类实例化的文章,会有详细解释的
- 2楼网友:封刀令
- 2021-01-26 09:03
因为函数里面没有调用任何成员变量,所有类实例共享同一成员函数地址,也就是这个函数地址从编译完就不会再变了,类实例化只是实例化成员变量而已。所以跟调用一个函数一样,但是如果里面调用了成员变量就会出错。
- 3楼网友:神的生死簿
- 2021-01-26 08:41
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;
}
- 4楼网友:轻雾山林
- 2021-01-26 08:01
引用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;
}
- 5楼网友:孤老序
- 2021-01-26 07:34
这与类名调用函数是一样的
与对象无关
哦 错了 只有静态函数才可以
好像是这样
主动使用一个类时,类就会加载到内存中
包括类的静态成员,和方法(静态和非静态都会加载)
如此,我们声明一个类指针时,类就会被加载
所以即使是一个空指针,但访问的是类的方法。
我要举报
大家都在看
推荐资讯