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

C++ object initialization without new keyword and using 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 行的方法。还有为什么当我尝试访问成员变量时出现错误。 提前致谢。

之所以有效,是因为在幕后 B::display() 是作为 display(B* this) 实现的,而您没有对 this 做任何事情。

如果您尝试使用 this-> 访问任何成员变量,您将看到真正的问题。

能够在未初始化对象的情况下调用非静态函数,这是您的幸运。在这种情况下,指针 b 指向一些垃圾,幸运的是你得到了想要的结果。您将无法访问或修改(即使它们是 public)数据成员,因为没有为它们分配内存

您正在调用未定义的行为。在这种情况下,大多数编译器将永远不会尝试访问 "this" 中的任何内容,而你会侥幸逃脱。但该标准并不保证这会起作用。密码坏了。

这里有更多的讨论;他们谈论空指针,但对于我们的目的来说,垃圾指针几乎是一样的。 When does invoking a member function on a null instance result in undefined behavior?