string dots(10, '.'); // 直接初始化
string s(dots); // 直接初始化
string s2 = dots; // 拷贝初始化
string null_bock = "9-999-99999-9"; // 拷贝初始化
string nines = string(100, 9); // 拷贝初始化
当使用直接初始化时,我们实际上是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。当我们使用拷贝初始化时,我们要求编译器将右侧运算对象拷贝到正在创建的对象中,如果需要的话还要进行类型转换。
拷贝初始化通常使用拷贝构造函数来完成。如果一个类有一个移动构造函数,则拷贝初始化有时会使用移动构造函数而非拷贝构造函数来完成。
拷贝初始化不仅在我们用=定义变量时会发生,在下列情况下也会发生
● 将一个对象作为实参传递给一个非引用类型的形参
● 从一个返回类型为非引用类型的参数返回一个对象
● 用花括号列表初始化一个数组中的元素或一个聚合类中的成员