在C++中使用默认构造函数初始化对象的不同方法
Different ways of initializing an object with default constructor in C++
struct A
{
int a;
std::string str;
};
A a;// 1
A a{};// 2
A a = {};// 3
A a = A();// 4
似乎有所有选择。在 1 和 4 的情况下,a
将未初始化,在 2 和 3 中,a
将以零初始化,它们都是相同的,只是风格问题还是有一些区别?4 应该首先创建一个临时对象,然后将其分配给a
,但只有当我完全关闭 comliler 的优化时才会发生这种情况,对吧?
对于所有情况,数据成员str
始终由默认构造函数std::string
进行默认初始化。由于初始化样式不同,数据成员a
可能会初始化为0
值或不确定值。在细节上,
-
第一个是默认初始化,因为结果
a.a
初始化为不确定值(或者如果a
是静态或线程本地对象,则初始化为零0
(,a.str
由其默认构造函数初始化。 -
第二个是直接列表初始化,执行聚合初始化,因为结果
a.a
被值初始化(零初始化(为0
,a.str
由其默认构造函数初始化。 -
第三个是复制列表初始化,执行聚合初始化,因为结果
a.a
被值初始化(零初始化(为0
,a.str
由其默认构造函数初始化。 -
在概念上,第四个是副本初始化,
a
是从A()
进行复制初始化的(值初始化临时A
(。由于复制 elision(自 C++17 以来它是强制性的(,a
可能直接进行值初始化,因为结果(不会通过复制 elision 更改(a.a
被零初始化为0
,a.str
由其默认构造函数初始化。
相关文章:
- 使用std::函数映射对象方法
- 正在调用shared_ptr对象方法
- 检查哪个对象调用了另一个对象的对象方法
- 如何在C++中循环访问未知对象方法?
- c++ 替换调用对象方法的宏函数
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 如何让两个不同的对象方法相互用作参数
- 在创建 c++ 期间调用对象方法
- 扩展中的日期时间对象方法C++问题
- 将对象方法从向量应用于C 的第二个向量中的对象
- 将 C++/CLI 对象指针传递给本机对象方法
- 多态性的面向对象方法
- 将对象方法传递到变量
- C :使用Main中定义的对象方法的函数
- 有关使用矢量迭代器访问对象方法的问题
- 定义可以执行对象方法和独立函数的函数时出现问题
- 调用列表中子对象方法的最佳方法
- main.cpp:(.text+0x8f):对[对象方法]的未定义引用
- cpp 从需要超类对象的函数访问子类对象方法