对于谁知道背景魔法可能是显而易见的,但我无法理解下面的代码如何提供正确的输出.我预计运行时错误.请帮忙.
class a
{
public:
void print()
{
cout<<"Hello\n"<<endl;
int d = 100;
cout<<d<<endl;
}
int val;
};
int main()
{
a* ptr;
ptr->print();
return SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
Hello
100
Run Code Online (Sandbox Code Playgroud)
没有魔法 - 你的代码有不确定的行为.在你的代码不访问ptr其隐式传递给print()为this指针,这就是为什么没有错误发生.
在其他几种情况下可能会发生:
访问a实例的字段.它将需要读取*(this + field_offset)将导致运行时错误的内存.
访问虚拟方法.我知道的实现使用vtable来做这件事,它通常作为第一个指针存储在对象空间中,因此指向vtable的指针 与此相同,因此:vtable = *this
其他情况,取决于编译器和平台
注意:示例中省略了类型转换 this