由用户定义的构造函数初始化

Initialization by user-defined constructor

本文关键字:构造函数 初始化 定义 用户      更新时间:2023-10-16

请考虑以下程序:

#include <iostream>
struct A
{
    A(int, int){ std::cout << "A(int, int)" << std::endl; }
};
A a(4,4);
A b{4,4};
A c({4,4});
int main(){ }

输出:

A(int, int)
A(int, int)
A(int, int)

演示

我感兴趣的是abc的初始化之间有区别吗?任何主题都是直接初始化的。

A a(4,4);

沼泽标准直接初始化

A b{4,4};

沼泽标准直接列表初始化。由于A没有initializer_list构造函数,因此最终会执行与上述相同的操作。没有std::initializer_list对象被构建或破坏。

A c({4,4});

直接初始化了来自A临时c,而临时又从大括号初始化列表{4, 4}复制列表初始化。请注意,如果A::A(int, int)explicit,这将不起作用,因为在这种情况下,复制列表初始化的格式不正确,并且您没有可行的构造函数可以调用。临时的建造和破坏可以省略,而且通常是。