its*_*att 15

A a;
Run Code Online (Sandbox Code Playgroud)

使用默认构造函数创建一个存在于堆栈中的A实例.

A *a;
Run Code Online (Sandbox Code Playgroud)

只是一个指向A 的未初始化指针.它实际上并不指向A对象,但可以.初始化指针(在本例中,设置为NULL)将如下所示:

A *a = 0;
Run Code Online (Sandbox Code Playgroud)

这里的区别在于,当未初始化的指针指向任何位置时,空指针不指向任何对象.初始化你的指针是一个很好的做法,以免你发现自己想知道为什么你的程序爆炸或产生不正确的结果.

同样,您不希望尝试取消引用 NULL指针或未初始化的指针.但是你可以测试NULL指针.测试未初始化的指针会产生未确定和错误的结果.它实际上可能是!= 0但肯定不会指向你想要指向的任何地方.确保你初始化测试之前您的指针和测试他们试图取消引用它们之前.

A a = new A();
Run Code Online (Sandbox Code Playgroud)

应该写成

A *a = new A();
Run Code Online (Sandbox Code Playgroud)

并创建一个在堆上分配的新A对象.A对象是使用默认构造函数创建的.

如果没有为类显式编写默认构造函数,编译器将隐式创建一个,尽管我不相信标准没有为隐式实例化的对象指定数据成员的状态.有关隐式默认构造函数的讨论,请参阅Martin York对此SO问题的回答.

  • 值得注意的是,如果您要提及堆分配版本,那么`A a`也会调用默认构造函数. (2认同)
  • 最后一个声明是incorect.使用*value-initialization*创建对象`A()`.它不使用"A"的任何结构(在这种情况下).表达式`A()`仅在用户显式声明时才使用默认的构造函数.否则,初始化继续进行而不使用构造函数. (2认同)

Fed*_*oca 8

A a声明一个Anamed 的实例a

A *a声明一个指向A类的指针

A *a = new A()a在堆上分配空间并调用正确的构造函数(如果未指定构造函数,则执行默认初始化).

有关最后一个表格的更多信息,请参阅http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

  • 虽然最后一个应该是'A*a = ...` (2认同)