gpt4 book ai didi

c++ - 调用成员函数而不初始化指针变量

转载 作者:行者123 更新时间:2023-11-28 06:58:42 25 4
gpt4 key购买 nike

我创建了两个类,A 和 B。B 包含一个指向 A 的指针,但从未初始化 A。但是,我能够在不初始化 A 的情况下调用 A 的函数。这如何/为什么可能?

 class A
{
public:
void Test() {
printf("Test from A\n");
}
};


class B
{

public:
B() {
}
~B() {
}
void T() {
a->Test();
}
private:
A* a;
};


int main() {

B b;
b.T();
/*
B* b;
b->T(); //This does not work, as expected. So why can I call a->Test via b.T(), and have that work when a was never initialized?
*/

system("PAUSE");
return 0;
}

最佳答案

这是因为编译器在内部将 a->Test() 之类的调用转换为略有不同的形式:

A::Test(a);

如您所见,它调用的函数只是一个地址,它调用的对象作为参数传递,可以是 nullptr/uninitialized/anything。

对于虚函数,它几乎是一样的,只是涉及到更多的细节:

a->vtbl[0](a);

其中 vtbl 是一个虚函数指针表,通常在对象构造时初始化,但它的偏移量通常在编译时已知,这就是为什么编译器在一个不存在的对象上“调用”它不会有任何麻烦'存在 - 它只会从随机内存位置读取垃圾并愉快地使用它。

关于c++ - 调用成员函数而不初始化指针变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22819022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com