C++以两种不同的方式从类中实例化一个对象

标签 c++ object constructor instantiation

我很确定以前有人问过这个问题,但我终究无法通过搜索找到它。

就是这样:

有什么区别:

MyObj myObj;

MyObj myObj = MyObj();

我相信两者都可以达到相同的效果,但是一个比另一个更好用吗?假设我只需要默认构造函数。

*edit - 我听说第一个更合适,因为第二个首先通过默认构造函数创建一个对象,然后对 myObj 进行赋值。第一个没有“分配”操作,所以第一个会“更快”。真相?

最佳答案

是的,可能会有差异。

在第一个实例中,如果 myObj 是 POD 类型,则它不会被初始化,否则它会被默认初始化

在第二个实例中,myObj 是从一个value-initialized 临时copy-initialized。可以(并且几乎肯定应该)消除临时值以产生值初始化的效果。

如果 MyObj 有一个构造函数,那么总是会调用一个构造函数。对于第一种情况,默认构造函数必须是可访问的,对于第二种情况,复制构造函数和默认构造函数都必须是可访问的,尽管只能调用默认构造函数。

除了 POD 类型的“未初始化”和值初始化之间的明显区别外,默认初始化值初始化之间也有区别-为没有用户定义的构造函数的非 POD 类型初始化。对于这些类型,POD 成员不会在默认初始化 中进行初始化,而是在父类的值初始化 中进行零初始化

关于C++以两种不同的方式从类中实例化一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504722/

相关文章:

c++ - C++ 中简单的 int 到 float 转换

c++ - 使球体上的球具有暗带

c++ - 如何为 wxWidgets 编写 GUI 测试

c++ - 为什么这个例子会给出一个段错误?

javascript - 如何使用对象求和值?在 JavaScript 中

javascript - 合并具有相同值的对象中的 JavaScript 对象

c++ - 在构造函数上启动线程时调用不匹配

java - 使用 Swing 组件将文本发送到另一个对象

c# - 构造一个(有点)复杂的对象

c# - 当我使用它时,我的 IF 属性在我的类(class)中被忽略了