关于对象的动态内存初始化,这两个语句之间有什么区别: -
class_name * obj = new class_name;
class_name obj = class_name();
答案 0 :(得分:3)
第一个例子大致如下:
第二个例子:
编辑:实际上,我为上面第二个例子所写的内容并不正确(也许它也没错)。我不知道这里的标准,但是使用VC12(优化关闭)代码不会创建临时对象。它只是调用堆栈上对象的默认构造函数。如果有一个私有赋值运算符,代码就不会编译 - 正如James在他的评论中所写的那样。
答案 1 :(得分:2)
第一个动态定义指向class_name
的指针
分配该类型的对象,并初始化指针
以其地址。对象本身的生命周期是
你明确删除它。如果class_name
有默认值
构造函数,被称为;否则,对象不是
初始化。
第二个定义class_name
的实例;它正式地说
使用默认值构造该类型的临时文件
如果定义了一个构造函数,或者如果没有则构造函数为零,
和copy从中构造定义的实例。该
但是,允许编译器忽略此复制结构
(以及我所知道的所有事情),并构造定义的对象
直。 (它仍然必须验证是否存在可访问性
但是,复制构造函数。)已定义对象的生命周期
直到它超出范围。
一般来说,除非我们确实需要,否则我们会避开第一种形式 显性寿命。
答案 2 :(得分:1)
首先是动态分配。第二个是静态分配,但值已初始化。
答案 3 :(得分:1)
此:
class_name *obj = new class_name;
在堆上创建一个对象,您需要通过delete
删除它以避免内存泄漏。
此:
class_name obj = class_name();
在堆栈上创建一个对象,当该对象超出范围时将被删除。
答案 4 :(得分:1)
希望您正确地关联了作业/问题文本。这很微妙。 “动态”与第一个语句中的动态分配无关。
()
括号确保C ++ 03 值初始化,对于POD类型,这意味着归零。没有它(第一个语句),如果类是POD,则其成员不需要初始化。我必须检查更一般情况的标准,但我认为,既然你知道问题是什么,那就是你可以自己做的事情。