Sac*_*iya 2 c++ variables class declaration
Class A
{
};
Run Code Online (Sandbox Code Playgroud)
有什么区别A a
,A* a
和A* a = new A()
.
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
声明一个A
named 的实例a
A *a
声明一个指向A
类的指针
A *a = new A()
a
在堆上分配空间并调用正确的构造函数(如果未指定构造函数,则执行默认初始化).
有关最后一个表格的更多信息,请参阅http://en.wikipedia.org/wiki/New_%28C%2B%2B%29