通过深拷贝完成带有指针成员的对象的复制

  1. #include "bits/stdc++.h"
  2. using namespace std;
  3. class Demo {
  4. public:
  5. Demo(): num(new int(0)) {
  6. cout<<"construct"<<endl;
  7. }
  8. Demo(const Demo &d): num(new int(*d.num)) { // 拷贝构造函数
  9. cout<<"copy construct"<<endl;
  10. }
  11. ~Demo() {
  12. cout<<"destruct"<<endl;
  13. }
  14. private:
  15. int *num;
  16. };
  17. Demo get_Demo() { // 调用默认构造函数生成匿名对象
  18. return Demo(); // 调用拷贝构造函数复制匿名对象并作为返回值,匿名对象销毁
  19. }
  20. int main() {
  21. Demo a = get_Demo(); // 再调用拷贝构造函数将临时对象复制给a,临时对象析构
  22. return 0;
  23. }

移动构造函数

  1. #include "bits/stdc++.h"
  2. using namespace std;
  3. class Demo {
  4. public:
  5. Demo(): num(new int(0)) {
  6. cout<<"construct"<<endl;
  7. }
  8. Demo(const Demo &d): num(new int(*d.num)) { // 拷贝构造函数
  9. cout<<"copy construct"<<endl;
  10. }
  11. Demo(Demo &&d): num(d.num) { // 移动构造函数,采用右值引用,对 num 进行浅拷贝
  12. d.num = nullptr;
  13. cout<<"move construct"<<endl;
  14. }
  15. ~Demo() {
  16. cout<<"destruct"<<endl;
  17. }
  18. private:
  19. int *num;
  20. };
  21. Demo get_Demo() { // 调用默认构造函数生成匿名对象
  22. return Demo(); // 调用拷贝构造函数复制匿名对象并作为返回值,匿名对象销毁
  23. }
  24. int main() {
  25. Demo a = get_Demo(); // 再调用拷贝构造函数将临时对象复制给a,临时对象析构
  26. // 使用临时对象初始化 a 的2次拷贝,都是通过移动构造函数完成
  27. return 0;
  28. }

当类中同时包含拷贝构造函数和移动构 造函数时,如果使用临时对象初始化当前类的对象,编译器会优先调 用移动构造函数来完成此操作。只有当类中没有合适的移动构造函数 时,编译器才会退而求其次,调用拷贝构造函数。