忍不住了,不得不吐槽一下,妈的,太复杂了,真难,搞得太复杂了,看不懂,看不懂,真的越来越复杂了,没有必要啊!
看得了头皮发麻,搞不明白,咱又不是干编译器的,投降了。 工程代码中,代码风格要保持简洁,可读性好,可维护性好,没事千万别整一些奇奇怪怪的初始化秀技术,别过度依赖语言特性与编译器特性,最简单就是最好的!
我摊牌了,看了两天没有彻底看明白,我放弃了。把我看明白的部分作一下笔记,免得后续忘记了又重复看,浪费时间。
C++的初始化方式
- Value initialization, e.g. std::string s{};
- Direct initialization, e.g. std::string s(“hello”);
- Copy initialization, e.g. std::string s = “hello”;
- List initialization, e.g. std::string s{‘a’, ‘b’, ‘c’};
- Aggregate initialization, e.g. char a[3] = {‘a’, ‘b’};
- Reference initialization, e.g. char& c = a[0];
只介绍一下值初始化与聚合初始化, 因为很常用,尤其是咱们初始化结构体对象时。
值初始化
使用空的 {}
进行值初始化。(即然c++11已经引入了 {}
, 咱们也就别使用 ()
了吧,也就提了)。
规则是这样的:
我只记两点:
第一:当对一个类对象提供了默认构造函数时,进行值初始化时,会执行你提供的构造函数,如果你的构造函数内未对成员变量进行初始化,它们就是未初始化状态。
第二:当用户不提供任何构造函数时,编译器会生成默认的构造函数,进行值初始化时,会首先进行零初始化,然后再调用默认生成的构造函数(non-trivial时)。
聚合初始化
针对聚合体,会进行聚会初始化, 使用 {arg1, arg2, …}的格式。
- no private or protected direct (since C++17)non-static data members
- no user-declared constructors (until C++11)
- no user-provided constructors (explicitly defaulted or deleted constructors are allowed)(since C++11)(until C++17)
- no user-provided, inherited, or explicit constructors (explicitly defaulted or deleted constructors are allowed)(since C++17)(until C++20)
- no user-declared or inherited constructors(since C++20)
- no virtual, private, or protected (since C++17) base classes
- no virtual member functions
- no default member initializers (since C++11) (until C++14)
强烈建议
Original: https://www.cnblogs.com/yinheyi/p/14839418.html
Author: 殷大侠
Title: c++的对象初始化
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535448/
转载文章受原作者版权保护。转载请注明原作者出处!