C++ Primer 5th笔记(chap 13 拷贝控制)拷贝构造函数

本文详细介绍了C++中的拷贝构造函数,包括其定义、作用以及何时会被编译器自动生成。此外,还讨论了拷贝初始化的过程,解释了在不同情况下如何使用拷贝构造函数以及何时编译器可能会绕过它。同时,文章提到了移动构造函数的影响和私有拷贝构造函数的后果。最后,阐述了拷贝初始化在参数传递、函数返回和数组初始化等场景的应用。
摘要由CSDN通过智能技术生成

1. 拷贝构造函数

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

class Foo{
public:
    Foo();//默认构造函数  (仅在程序员没有定义构造函数的情况下)
    Foo(const Foo&);//拷贝构造函数
};

注:拷贝构造函数通常不应该是explicit的, 否则不能用于拷贝形式初始化

Sales_data item1(null_book);   // 正确:直接初始化
Sales_data item2 = null_book; //错误:不能将explicit的构造函数用于拷贝形式初始化过程

2、合成拷贝构造函数synthesized copy constructor

如果我们没有给一个类定义拷贝构造函数,则编译器会定义一个拷贝构造函数。

2.1 定义

编译器将其参数的成员逐个拷贝到正在创建的对象中,编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中。

  • 类类型成员:使用它的拷贝构造函数来拷贝
  • 内置类型:直接拷贝
  • 数组类型:逐元素拷贝

2.2 如果使用的初始化值要求通过一个 explicit 的构造函数来进行类型转换

vector<int> v1(10);		//正确,直接初始化
vector<int> v2 = 10;	//错误,接受大小参数的构造函数是explicit 的
void f(vector<int>);	//f的参数进行拷贝初始化
f(10);					//错误,不能使用一个explicit的构造函数拷贝一个实参
f(vector<int>10);		//正确,从一个int值直接构造一个临时的vector

3、拷贝初始化
3.1 定义

. 使用指定构造函数创建一个临时对象
. 复制构造函数将那个临时对象复制到正在创建的对象。

3.2 两种初始化

直接初始化: 直接调用与实参匹配的构造函数
拷贝初始化:总是调用复制构造函数

string dots(10,'.');		//直接初始化
string s(dots);			    //直接初始化
string s2 = dots;		        //拷贝初始化
string s3 = "9-999-9";	 	    //拷贝初始化
string s4 = string(100,'9');	//拷贝初始化

3.3 注意

. 如果一个类有一个移动构造函数,则拷贝初始化有时会使用移动构造函数而非拷贝构造函数。
. 当复制构造函数被声明为私有时,所有的复制初始化都不能使用。

3.4 拷贝初始化的其他情形:

不仅仅在使用= 定义变量时发生拷贝初始化,如下情况也会发生拷贝初始化:

  • 将一个对象作为实参传递给一个非引用类型的形参。
  • 从一个返回类型为非引用类型的函数返回对象。
  • 用花括号列表初始化一个数组中的元素或者一个聚合类中的成员。
  • 某些类类型还会对它们所分配的对象使用拷贝初始化,当初始化标准库容器时,调用其 insert 或 push 成员,容器会对其元素进行拷贝初始化,与之相对,用 emplace 创建的成员执行直接初始化。

4. 编译器可以绕过拷贝构造函数

在拷贝初始化的过程中,编译器可以(但不是必须)跳过拷贝/移动构造函数,直接创建对象。
eg.

string null_book = "9-999-9";	//拷贝初始化
->
string null_book("9-999-9");	//编译器略过了拷贝构造函数
  • 前提条件:拷贝/移动构造函数必须是存在并且可访问的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thefist11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值