我有一个简单的课程:
class B
{
public:
int getData() { return 3; }
};
然后,我使用nullptr初始化指向它的指针:
B *foo{ nullptr };
然后,尝试使用它会让人感到惊讶:
int t = foo->getData();
和t现在是3.如果没有构建类,这怎么可能?是因为getData()不使用"这个"?这打破了我对指针的所有了解。
这是预期的行为吗?我在Visual Studio 2013中工作。
答案 0 :(得分:3)
这是undefined behavior,所以你真的应该非常scared。
显然可能会做某事(在你的C ++实现上),因为this
函数不是虚拟的,不使用getData
的任何成员。因此生成的代码不会取消引用空指针。
答案 1 :(得分:2)
答案 2 :(得分:1)
未定义的行为,您正在从nullptr
访问成员方法。不会定义任何特定的行为或结果。
在这种情况下;给定(cppreference):
关键字
this
是一个prvalue表达式,其值是对象的地址,在该对象上调用成员函数。
由于NULL
的{{1}}值未被取消引用 - 成员方法不是虚拟的,并且不访问this
的任何成员数据 - 它似乎“似乎”起作用。