C++对象初始化,无需 new 关键字并使用指针
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 行中的方法。这也是为什么当我尝试访问成员变量时出现错误的原因。提前谢谢。
您正在调用未定义的行为。在这种情况下,大多数编译器永远不会尝试访问"this"中的任何内容,您将侥幸逃脱。但该标准并不能保证这将起作用。代码已损坏。
这里有更多的讨论;他们谈论空指针,但对于我们的目的,垃圾指针几乎是相同的。何时在 null 实例上调用成员函数会导致未定义的行为?
它
之所以有效,是因为在幕后B::display()
是按display(B* this)
实现的,而您没有对this
做任何事情。
如果您尝试使用 this->
访问任何成员变量,您将看到真正的问题。
幸运的是,
您能够在不初始化对象的情况下调用非静态函数。在这种情况下,指针 b 指向一些垃圾,幸运的是你得到了想要的结果。您将无法访问或修改(即使它们是公共的)数据成员,因为没有为其分配内存
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 新的自动关键字指针是否会自行删除?
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 自动关键字与智能指针一起
- C++指针上的关键字运算符"this"
- 为什么此指针值在C 中添加虚拟关键字后更改
- 是否可以将“自动”关键字用作函数指针声明中使用初始化的返回类型
- 为什么没有必要将此关键字用于指针
- 为什么当我使用"new"关键字声明数组指针时无法删除它
- 指针在没有新关键字的C 中指针
- 在 C++ 中使用关键字 using 声明模板化函数指针的语法
- 为什么 auto 关键字不能与指向函数的指针的初始化列表一起使用?
- 返回指向 const 数据成员和 'auto' 关键字的 const 指针。有点困惑
- 智能指针删除器和"using"名称为"pointer"关键字
- C++中“virtual”关键字在对象而不是指针上的行为
- C++对象初始化,无需 new 关键字并使用指针
- 如何将指针与delete关键字和析构函数一起使用
- 在指向对象的指针映射上的迭代器作为关键字c++
- 指针关键字在FORTRAN中相当于C/ c++
- 为什么new关键字返回指针而不是引用