基本概念

2.PNG

  1. //不写复制构造函数
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. class Complex
  5. {
  6. public:
  7. double real,imag;
  8. };
  9. int main(void)
  10. {
  11. Complex c1;//调用缺省无参构造函数
  12. c1.imag=4,c1.real=3;//手动初始化
  13. Complex c2(c1);//调用编译器自带的缺省复制构造函数,将c2初始化成和c1一样
  14. std::cout<<c2.real<<ends<<c2.imag; //3 4
  15. return 0;
  16. }
  1. //自己写复制构造函数
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. class Complex
  5. {
  6. public:
  7. double real,imag;
  8. Complex(double,double);
  9. Complex(const Complex&);
  10. };
  11. Complex::Complex(double r,double i)
  12. {
  13. real=r;
  14. imag=i;
  15. }
  16. Complex::Complex(const Complex &C)
  17. {
  18. real=C.real;
  19. imag=C.imag;
  20. std::cout<<"Copy Constructor Called"<<endl;
  21. }//自己定义了,则编译器默认自带的复制构造函数不存在
  22. int main(void)
  23. {
  24. Complex c1(3,4);
  25. Complex c2(c1);
  26. std::cout<<c2.real<<ends<<c2.imag<<endl;
  27. //Copy Constructor Called
  28. //3 4
  29. return 0;
  30. }

复制构造函数起作用的两种情况

1.用一个对象初始化另一个对象

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6. int x;
  7. A(int);
  8. A(const A&);
  9. };
  10. A::A(const A& a)
  11. {
  12. x=a.x;
  13. std::cout<<"Copy Constructor Called"<<endl;
  14. }
  15. A::A(int n)
  16. {
  17. x=n;
  18. }
  19. int main(void)
  20. {
  21. A c1(3);
  22. c1.x=4;
  23. A c2=c1;//初始化语句,非赋值语句,等价于A c2(c1)
  24. //Copy Constructor Called
  25. return 0;
  26. }

2.如果某个函数的参数是类的对象,调用该函数时,类的复制构造函数会被调用

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6. int x;
  7. A(int);
  8. A(const A&);
  9. };
  10. A::A(const A& a)
  11. {
  12. x=a.x;
  13. std::cout<<"Copy Constructor Called"<<endl;
  14. }
  15. A::A(int n)
  16. {
  17. x=n;
  18. }
  19. void getA(const A c)//参数得是对象,不可以是对象的引用或者指针
  20. {
  21. std::cout<<c.x<<endl;
  22. }
  23. int main(void)
  24. {
  25. A c1(3);//通过构造函数初始化
  26. getA(c1);//调用函数时,可以理解系统执行了一句A c(c1)的语句
  27. //Copy Constructor Called
  28. //3
  29. return 0;
  30. }

注意:对象间的赋值不会导致复制构造函数的调用
**

常引用(const X&)参数的使用

3.PNG

四个字总结构造函数和复制构造函数

构造函数:自食其力
复制构造函数:拿来主义