通过深拷贝完成带有指针成员的对象的复制
#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;}
当类中同时包含拷贝构造函数和移动构 造函数时,如果使用临时对象初始化当前类的对象,编译器会优先调 用移动构造函数来完成此操作。只有当类中没有合适的移动构造函数 时,编译器才会退而求其次,调用拷贝构造函数。
