文章目录
- 初始化
- 拷贝初始化
- 直接初始化
- 什么是拷贝构造函数
- 拷贝初始化与拷贝构造函数
- 拷贝构造函数可能在何时调用
- 例子
初始化
变量的初始化有两种方式:
- 直接初始化(direct initialization)
- 拷贝初始化(copy initialization)
拷贝初始化
如果使用等号(=)初始化一个变量,则执行的是拷贝初始化。
直接初始化
不使用等号的,则是直接初始化。
什么是拷贝构造函数
如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数
拷贝初始化与拷贝构造函数
拷贝初始化依靠拷贝构造函数(通常)或移动构造函数来完成
拷贝构造函数可能在何时调用
- 使用等号定义一个变量时
- 将一个对象作为实参传递给一个非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象1
- 用花括号列表初始化一个数组中的元素或一个聚合类中的成员
例子
string s="123456";
因为使用了等号,所以这里是拷贝初始化,这里拷贝初始化依靠拷贝构造函数完成。正常流程如下:
- "123456"隐式转化为string类型,生成一个临时的string对象
- 此时正在定义变量s,因此调用拷贝构造函数string(const &s)
- s初始化完成
注意,某些编译器会进行优化,因为string有接受一个const char *的构造函数,所以可能优化为直接调用该构造函数,相当于直接初始化,而不经过上述1,2过程。关于优化问题的讨论,参见这里和这里