Class A
{
};
A a
,A* a
和A* a = new A()
之间有什么区别。
答案 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