拷贝控制概念
- 拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么 。拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么 。析构函数定义了当此类型对象销毁时做什么 。我们称这些操作为拷贝控制操作 。
- 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数 。
- 拷贝构造函数的第一个参数必须是一个引用类型 。虽然我们可以定义一个接受非
const引用的拷贝构造函数,但此参数几乎总是一个const的引用 。 - 拷贝构造函数在几种情况下都会被隐式地使用 。因此,拷贝构造函数通常不应该是explicit的 。
- 如果我们没有为一个类定义拷贝构造函数,编译器会为我们定义一个 。与合成默认构造函数不同,即使我们定义了其他构造函数,编译器也会为我们合成一个拷贝构造函数 。
- 一般情况,合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中 。编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中 。
- 每个成员的类型决定了它如何拷贝:对类类型的成员,会使用其拷贝构造函数来拷贝;内置类型的成员则直接拷贝 。虽然我们不能直接拷贝一个数组,但合成拷贝构造函数会逐元素地拷贝一个数组类型的成员 。如果数组元素是类类型,则使用元素的拷贝构造函数来进行拷贝 。
- 当使用直接初始化时,我们实际上是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数 。当我们使用拷贝初始化时,我们要求编译器将右侧运算对象拷贝到正在创建的对象中,如果需要的话还要进行类型转换 。
- 拷贝初始化通常使用拷贝构造函数来完成 。但是,如果一个类有一个移动构造函数,则拷贝初始化有时会使用移动构造函数而非拷贝构造函数来完成 。
- 拷贝构造函数在以下几种情况下会被使用(发生拷贝初始化):
- 拷贝初始化(用=定义变量)
- 将一个对象作为实参传递给一个非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 用花括号列表初始化一个数组中的元素或一个聚合类中的成员
- 某些类类型还会对它们所分配的对象使用拷贝初始化 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
