根据我在c ++中使用指针初始化对象时的知识,我们必须使用new关键字。但是在下面的例子中,指针没有指向用'new'初始化的对象,但我们仍然可以调用不修改成员变量的方法。
#include <iostream>
using namespace std;
class B
{
public:
void display()
{ cout<<"Content of base class.\n"; }
};
int main()
{
B *b; // line p : not initialized with 'new'
b->display(); //line q: this prints Content of base class
return 0;
}
在上面的代码中,我很困惑为什么我可以在main方法中调用第q行中的方法。也是为什么当我尝试访问成员变量时出现错误的原因。 提前谢谢。
答案 0 :(得分:2)
您正在调用未定义的行为。在这种情况下,大多数编译器将永远不会尝试访问内部的任何内容&#34;这个&#34;你会逃脱它。但是标准并不能保证这会起作用。代码坏了。
这里有更多的讨论;他们谈论空指针但是为了我们的目的,垃圾指针几乎是相同的。 When does invoking a member function on a null instance result in undefined behavior?
答案 1 :(得分:1)
它有效,因为封底B::display()
下面的display(B* this)
实现了this
,而你没有对this->
做任何事情。
如果您尝试使用{{1}}访问任何成员变量,您将看到真正的问题。
答案 2 :(得分:0)
祝你好运,你可以在没有初始化对象的情况下调用非静态函数。在这种情况下,指针b指向一些垃圾,幸运的是你获得了理想的结果。您将无法访问或修改(即使它们是公共的)数据成员,因为没有为它们分配内存