首页 » C++ » 你不知道的拷贝、赋值、移动构造函数

你不知道的拷贝、赋值、移动构造函数

原文 http://blog.csdn.net/wk_bjut_edu_cn/article/details/79148717

2018-01-25 02:00:58阅读(329)

前言:

当定义一个类时,我们显式地或隐式地指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。拷贝和移动构造函数定义了当用同类型的而另一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时做什么。这些操作都是拷贝控制操作。

拷贝构造函数

1.定义:如果一个构造函数的第一个参数是自身类类型的引用(你想想,如果参数不是引用类型,则为了调用拷贝构造函数,必须要拷贝实参,但为了拷贝实参,又需要定义拷贝构造函数,无限循环),且任何额外参数都有默认值,则此构造函数是拷贝构造函数。

2.认清直接初始化和拷贝初始化

string s1(10, 'a');//直接初始化
string s2(s1);//直接初始化
string s3 = s1;//拷贝初始化
string s4 = "abc";//拷贝初始化
string s5 = string(10, 'a');//拷贝初始化
拷贝初始化通常使用拷贝构造函数来完成。拷贝初始化不仅在使用=定义变量时会发生,还有以下情况:

<1>将一个对象作为实参传递给一个非引用类型的形参

<2>从一个返回类型为非引用类型的函数返回一个对象

<3>用花括号初始化一个数组中的元素或一个聚合类中的成员

3.拷贝初始化的限制

vector<int> v1(10);//正确。直接初始化
vector<int> v2 = 10;//错误。接受大小参数的构造函数是explicit(能够抑制函数定义的隐式转换)
void f(vector<int>);
f(10);//错误。不能用一个explicit的构造函数拷贝一个实参
f(vector<int>(10));//正确。从一个int直接构造一个临时vector
注意:vector的接受单一大小参数的构造函数是explicit的。

拷贝赋值运算符 接受一个本类型对象的赋值运算符版本。通常,拷贝赋值运算符的参数是一个const的引用,并返回指向本对象的引用。如果类未显示定义拷贝赋值运算符,编译器会自动合成一个。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹