基本概念

//不写复制构造函数#include<bits/stdc++.h>using namespace std;class Complex{public:double real,imag;};int main(void){Complex c1;//调用缺省无参构造函数c1.imag=4,c1.real=3;//手动初始化Complex c2(c1);//调用编译器自带的缺省复制构造函数,将c2初始化成和c1一样std::cout<<c2.real<<ends<<c2.imag; //3 4return 0;}
//自己写复制构造函数#include<bits/stdc++.h>using namespace std;class Complex{public:double real,imag;Complex(double,double);Complex(const Complex&);};Complex::Complex(double r,double i){real=r;imag=i;}Complex::Complex(const Complex &C){real=C.real;imag=C.imag;std::cout<<"Copy Constructor Called"<<endl;}//自己定义了,则编译器默认自带的复制构造函数不存在int main(void){Complex c1(3,4);Complex c2(c1);std::cout<<c2.real<<ends<<c2.imag<<endl;//Copy Constructor Called//3 4return 0;}
复制构造函数起作用的两种情况
1.用一个对象初始化另一个对象
#include<bits/stdc++.h>using namespace std;class A{public:int x;A(int);A(const A&);};A::A(const A& a){x=a.x;std::cout<<"Copy Constructor Called"<<endl;}A::A(int n){x=n;}int main(void){A c1(3);c1.x=4;A c2=c1;//初始化语句,非赋值语句,等价于A c2(c1)//Copy Constructor Calledreturn 0;}
2.如果某个函数的参数是类的对象,调用该函数时,类的复制构造函数会被调用
#include<bits/stdc++.h>using namespace std;class A{public:int x;A(int);A(const A&);};A::A(const A& a){x=a.x;std::cout<<"Copy Constructor Called"<<endl;}A::A(int n){x=n;}void getA(const A c)//参数得是对象,不可以是对象的引用或者指针{std::cout<<c.x<<endl;}int main(void){A c1(3);//通过构造函数初始化getA(c1);//调用函数时,可以理解系统执行了一句A c(c1)的语句//Copy Constructor Called//3return 0;}
常引用(const X&)参数的使用

四个字总结构造函数和复制构造函数
构造函数:自食其力
复制构造函数:拿来主义
