C ++中变量声明的差异

时间:2010-04-16 11:05:48

标签: c++ class variables declaration

Class A 
{
};

A aA* aA* a = new A()之间有什么区别。

2 个答案:

答案 0 :(得分:15)

A a;

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

A *a;

只是一个指向A的未初始化的指针。此时它实际上并不指向A对象,但可以。初始化指针(在本例中,设置为NULL)看起来如下:

A *a = 0;

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

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

A a = new A();

应该写成

A *a = new A();

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

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

答案 1 :(得分:8)

A a声明A名为a

的实例

A *a声明指向A

的指针

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

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