1. 列表初始化
- 初始化一个数组
int a[] = {1, 2};
- C++98语法初始化一个vector
vector<int> v;
v.push(1);
v.push(2);
- c++11语法初始化一个vector
vector<int> v{1, 2};
使用{}对成员逐个进行初始化的方法称为列表初始化,即initializer_list
2. 统一初始化
即使用{}对变量进行初始化。
例子:
- 内置数据类型
无初始化 | 默认初始化 | 统一初始化 |
---|---|---|
int n; |
int i{}; // 默认清0 |
int j{2}; |
bool a; |
bool a{}; // 默认false |
bool a{true}; |
- string
string s;
: default construtor string()string s{};
:default construtor string()string s{"hello"};
- 结构体
point p{};
:声明一个point对象,并memset为0
3. 非explicit时的自动构造
vector<point> v{{1, 2}, {3, 4}};
{1,2}
没有显式地说明要构造的类型
4. 构造函数初始化 VS 初始化列表
- 例子
vector<int> v1{3, 5}; // v1为{3, 5},初始化列表
vector<int> v2(3, 5); // v2为{5, 5, 5},构造函数初始化
我的理解是:
如果类有(int, int)的构造函数,则(int, int)调用构造函数,{int, int}调用初始化列表。
如果类没有(int, int)的构造函数,则(int, int)和{int, int}的效果一样,都是调用初始化列表。
- 例子
如果类A有构造函数A(),则
A a1; // 正确
A a2(); // 错误,会被当成函数声明
A a3{}; // 正确
5. 类成员的默认初始化
class A{
public:
A() = default; // (1)default constructor
A(int x, int y):x_(x) {} // (2) other constructor
private:
int x_{}; // 默认初始化,清0
int y_{}; // 默认初始化,清0
}
调用(1)时,x_
和y_
都使用默认初始化。
调用(2)时,x_
有指明初始化方式,使用x_(x)
,y_
没有指明初始化方式,使用y_{}
6. 零初始化
自定义类,如果有default constructor,那么当调用default constructor时效果为零初始化。
使用隐式的constructor,或显式地将constructor设置为=default,都可以得到Default constructor。
当使用以下方式构造对象时会调用default constructor。
T()
T{}
T obj{}
new T()
new T{}
举例:
T t; // 无初始化
T t{}; // 零初始化
T t{5}; // 带参的构造函数
T *p = new T; // 无初始化
T *p = new T(); // 零初始化
T *p = new T{}; // 零初始化
7. 标准后缀
使用标准后缀生成字面量 | 对应的普通写法 |
---|---|
"Hello"s |
std::string("Hello") |
1s |
std::chrono::seconds(1) |
2i |
std::complex(0, 2) |
3f |
float(3) |
4u |
8. 用户自定义的特殊后缀
|