文章目录

  • 初始化
  • 拷贝初始化
  • 直接初始化
  • 什么是拷贝构造函数
  • 拷贝初始化与拷贝构造函数
  • 拷贝构造函数可能在何时调用
  • 例子


初始化

变量的初始化有两种方式:

  • 直接初始化(direct initialization)
  • 拷贝初始化(copy initialization)

拷贝初始化

如果使用等号(=)初始化一个变量,则执行的是拷贝初始化。

直接初始化

不使用等号的,则是直接初始化。

什么是拷贝构造函数

如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数

拷贝初始化与拷贝构造函数

拷贝初始化依靠拷贝构造函数(通常)或移动构造函数来完成

拷贝构造函数可能在何时调用

  1. 使用等号定义一个变量时
  2. 将一个对象作为实参传递给一个非引用类型的形参
  3. 从一个返回类型为非引用类型的函数返回一个对象1
  4. 用花括号列表初始化一个数组中的元素或一个聚合类中的成员

例子

string s="123456";

因为使用了等号,所以这里是拷贝初始化,这里拷贝初始化依靠拷贝构造函数完成。正常流程如下:

  1. "123456"隐式转化为string类型,生成一个临时的string对象
  2. 此时正在定义变量s,因此调用拷贝构造函数string(const &s)
  3. s初始化完成
    注意,某些编译器会进行优化,因为string有接受一个const char *的构造函数,所以可能优化为直接调用该构造函数,相当于直接初始化,而不经过上述1,2过程。关于优化问题的讨论,参见这里和这里