根据我在c++中的知识,当使用指针初始化对象时,我们必须使用新关键字。但在下面的示例中,指针并不指向使用“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;
}在上面的代码中,我很困惑为什么我可以在主方法中调用Q行中的方法。此外,当我尝试访问一个成员变量时,我会得到一个错误。提前谢谢。
发布于 2015-01-05 06:44:30
您正在调用未定义的行为。在这种情况下,大多数编译器都不会尝试访问" this“中的任何内容,这样您就可以摆脱它了。但这一标准并不能保证这将奏效。密码坏了。
这里还有更多的讨论;他们谈论空指针,但就我们的目的而言,垃圾指针几乎是一样的。When does invoking a member function on a null instance result in undefined behavior?
发布于 2015-01-05 06:40:21
它之所以起作用是因为,在封面下面,B::display()被实现为display(B* this),而您没有使用this进行任何操作。
如果您尝试使用this->访问任何成员变量,您将看到真正的问题。
发布于 2015-01-05 06:41:42
这是你的好运,你能够调用非静态函数,而不使对象不受影响。在本例中,指针b指向一些垃圾,幸运的是得到了所需的结果。您将无法访问或修改数据成员(即使它们是公共的),因为没有为它们分配内存。
https://stackoverflow.com/questions/27774516
复制相似问题