C++对象初始化,无需 new 关键字并使用指针

C++ object initialization without new keyword and using pointers

本文关键字:指针 关键字 new 对象 初始化 无需 C++      更新时间:2023-10-16

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

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

这里有更多的讨论;他们谈论空指针,但对于我们的目的,垃圾指针几乎是相同的。何时在 null 实例上调用成员函数会导致未定义的行为?

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

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

幸运的是,

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