通过深拷贝完成带有指针成员的对象的复制
#include "bits/stdc++.h"
using namespace std;
class Demo {
public:
Demo(): num(new int(0)) {
cout<<"construct"<<endl;
}
Demo(const Demo &d): num(new int(*d.num)) { // 拷贝构造函数
cout<<"copy construct"<<endl;
}
~Demo() {
cout<<"destruct"<<endl;
}
private:
int *num;
};
Demo get_Demo() { // 调用默认构造函数生成匿名对象
return Demo(); // 调用拷贝构造函数复制匿名对象并作为返回值,匿名对象销毁
}
int main() {
Demo a = get_Demo(); // 再调用拷贝构造函数将临时对象复制给a,临时对象析构
return 0;
}
移动构造函数
#include "bits/stdc++.h"
using namespace std;
class Demo {
public:
Demo(): num(new int(0)) {
cout<<"construct"<<endl;
}
Demo(const Demo &d): num(new int(*d.num)) { // 拷贝构造函数
cout<<"copy construct"<<endl;
}
Demo(Demo &&d): num(d.num) { // 移动构造函数,采用右值引用,对 num 进行浅拷贝
d.num = nullptr;
cout<<"move construct"<<endl;
}
~Demo() {
cout<<"destruct"<<endl;
}
private:
int *num;
};
Demo get_Demo() { // 调用默认构造函数生成匿名对象
return Demo(); // 调用拷贝构造函数复制匿名对象并作为返回值,匿名对象销毁
}
int main() {
Demo a = get_Demo(); // 再调用拷贝构造函数将临时对象复制给a,临时对象析构
// 使用临时对象初始化 a 的2次拷贝,都是通过移动构造函数完成
return 0;
}
当类中同时包含拷贝构造函数和移动构 造函数时,如果使用临时对象初始化当前类的对象,编译器会优先调 用移动构造函数来完成此操作。只有当类中没有合适的移动构造函数 时,编译器才会退而求其次,调用拷贝构造函数。