文章目录
- 1.拷贝构造函数
- 2.移动构造函数
1.拷贝构造函数
拷贝构造函数,它是一种特殊的构造函数。它的作用就是用一个已经生成的对象来初始化另一个同类的对象。
当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝(而非浅拷贝)的方式复制该指针成员。
浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。深复制在计算机中开辟了一块新的内存地址用于存放复制的对象。
浅层复制之所以危险,是因为两个指针共同指向一片内存空间,若第一个指针将其释放,另一个指针的指向就不合法了。
深拷贝:
#include<iostream>
using namespace std;class base {
public:base(int value1,int value2) :p(new int),num(value2) {*p = value1;}base(const base& b) :p(new int), num(b.num) {*p = *(b.p);}//深拷贝/*base(const base& b) :p(b.p), num(b.num) {}//浅拷贝*/void print() {cout << "*p=" << *p << " num=" << num << endl;}~base() {delete p;}
private:int* p;int num;
};int main()
{base b1(10, 20);b1.print();base b2(b1);b2.print();return 0;
}
*p=10 num=20
*p=10 num=20
浅拷贝:
#include<iostream>
using namespace std;class base {
public:base(int value1,int value2) :p(new int),num(value2) {*p = value1;}/*base(const base& b) :p(new int), num(b.num) {*p = *(b.p);}//深拷贝*/base(const base& b) :p(b.p), num(b.num) {}//浅拷贝void print() {cout << "*p=" << *p << " num=" << num << endl;}~base() {delete p;}
private:int* p;int num;
};int main()
{base b1(10, 20);b1.print();base b2(b1);b2.print();return 0;
}
2.移动构造函数
所谓移动语义,指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象。简单的理解,移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源“移为已用”。
拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。
移动构造函数的参数和拷贝构造函数不同,拷贝构造函数的参数是一个左值引用,但是移动构造函数的初值是一个右值引用。意味着,移动构造函数的参数是一个右值或者将亡值的引用。也就是说,只用用一个右值,或者将亡值初始化另一个对象的时候,才会调用移动构造函数。而那个move语句,就是将一个左值变成一个将亡值。
#include<iostream>
using namespace std;class base {
public:base(int value1,int value2) :p(new int),num(value2) {*p = value1;}/*base(const base& b) :p(new int), num(b.num) {*p = *(b.p);}//深拷贝,拷贝构造函数*/base(base& b) :p(b.p), num(b.num) {b.p = NULL;}//移动构造函数void print() {cout << "*p=" << *p << " num=" << num << endl;}~base() {delete p;}
private:int* p;int num;
};int main()
{base b1(10, 20);b1.print();base b2(b1);b2.print();return 0;
}
*p=10 num=20
*p=10 num=20