1. 列表初始化

  1. 初始化一个数组
int a[] = {1, 2};
  1. C++98语法初始化一个vector
vector<int> v;
v.push(1);
v.push(2);
  1. 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 初始化列表

  1. 例子
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}的效果一样,都是调用初始化列表。

  1. 例子

如果类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. 用户自定义的特殊后缀

|

results matching ""

    No results matching ""