没有new关键字和使用指针的C ++对象初始化

时间:2015-01-05 06:35:49

标签: c++ pointers

根据我在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行中的方法。也是为什么当我尝试访问成员变量时出现错误的原因。 提前谢谢。

3 个答案:

答案 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指向一些垃圾,幸运的是你获得了理想的结果。您将无法访问或修改(即使它们是公共的)数据成员,因为没有为它们分配内存