1.直接初始化
1)直接初始化实际上是要求编译器选择参数最匹配的一般构造函数
2.拷贝初始化
1)拷贝初始化实际上时要求编译器将右侧运算对象拷贝到正在创建的对象中,如有需要,还要进行类型转换
2)拷贝初始化通常使用拷贝构造函数来完成
3)拷贝初始化发生时机:
- 用等号"="定义变量时(注意定义二字,不是定义的时候使用等号是调用拷贝赋值运算符)
- 将一个对象作为实参传递给一个非引用的形参
- 从一个返回类型为非引用类型的函数中返回一个对象
- 用花括号列表初始化数组元素或者一个聚合类中的成员(因为也用到了等号"="定义变量)
3)编译器可以“绕过”拷贝构造函数:即编译器有时可以进行优化(但不是必须),跳过拷贝构造函数,直接使用转换构造函数构造对象
string s = "666"; //先调用转换构造函数来构造一个临时的string对象(内容为:666),再调用拷贝构造函数用这个临时对象来构造s 编译器可以优化为: string s("666"); //直接调用转换构造函数来构造对象
来源:https://www.cnblogs.com/Joezzz/p/9717699.html