
拷贝构造函数
电梯工程-草船借箭课文
2023年2月22日发(作者:虚拟卡)拷贝构造函数的参数
拷贝构造函数
classA{
A(constA&a);
};
问题:
参数是否⼀定要加const?
1.拷贝构造函数的参数
1.1使⽤不加const的拷贝构造函数
#include
classA{
public:
A(){std::cout<<"Aconstruct."< ~A(){std::cout<<"Adesconstruct."< A(A&a){std::cout<<"Acopyconstruct"< //A(constA&a){std::cout<<"Aconstcopyconstruct"< }; intmain(intargc,char**argv){ Aa1; Aa2=a1; } 运⾏: Aconstruct. Acopyconstruct Adesconstruct. Adesconstruct. 1.2使⽤加const的拷贝构造函数 #include classA{ public: A(){std::cout<<"Aconstruct."< ~A(){std::cout<<"Adesconstruct."< //A(A&a){std::cout<<"Acopyconstruct"< A(constA&a){std::cout<<"Aconstcopyconstruct"< }; intmain(intargc,char**argv){ Aa1; Aa2=a1; } 运⾏: Aconstruct. Aconstcopyconstruct Adesconstruct. Adesconstruct. 1.3同时存在加const和不加const的拷贝构造函数 #include classA{ public: A(){std::cout<<"Aconstruct."< ~A(){std::cout<<"Adesconstruct."< A(A&a){std::cout<<"Acopyconstruct"< A(constA&a){std::cout<<"Aconstcopyconstruct"< }; intmain(intargc,char**argv){ Aa1; Aa2=a1; constAa3; Aa4=a3; } 运⾏: Aconstruct. Acopyconstruct Aconstruct. Aconstcopyconstruct Adesconstruct. Adesconstruct. Adesconstruct. Adesconstruct. 1.4只存在不加const的拷贝构造函数,异常情况1: #include classA{ public: A(){std::cout<<"Aconstruct."< ~A(){std::cout<<"Adesconstruct."< A(A&a){std::cout<<"Acopyconstruct"< //A(constA&a){std::cout<<"Aconstcopyconstruct"< }; intmain(intargc,char**argv){ Aa1; Aa2=a1; constAa3; Aa4=a3; } 编译错误:因为a3是常量 copy_:Infunction‘intmain(int,char**)’: copy_:18:9:error:binding‘constA’toreferenceoftype‘A&’discardsqualifiers Aa4=a3; ^ copy_:7:2:note:initializingargument1of‘A::A(A&)’ A(A&a){std::cout<<"Acopyconstruct"< 1.5只存在不加const的拷贝构造函数,异常情况2: #include classA{ public: A(){std::cout<<"Aconstruct."< ~A(){std::cout<<"Adesconstruct."< A(A&a){std::cout<<"Acopyconstruct"< //A(constA&a){std::cout<<"Aconstcopyconstruct"< }; Afun(){ returnA(); } intmain(intargc,char**argv){ Aa1; Aa2=a1; Aa3=fun(); } 编译失败:编译器⽣成的临时返回对象是常引⽤类型,因为随后临时对象赋值给其它变量时,不需要被赋值的变量去修改它; copy_:Infunction‘Afun()’: copy_:14:11:error:invalidinitializationofnon-constreferenceoftype‘A&’fromanrvalueoftype‘A’ returnA(); ^ copy_:7:2:note:initializingargument1of‘A::A(A&)’ A(A&a){std::cout<<"Acopyconstruct"< ^ copy_:Infunction‘intmain(int,char**)’: copy_:21:12:error:invalidinitializationofnon-constreferenceoftype‘A&’fromanrvalueoftype‘A’ Aa3=fun(); ^ copy_:7:2:note:initializingargument1of‘A::A(A&)’ A(A&a){std::cout<<"Acopyconstruct"< 1.6总结: **1.拷贝构造函数的参数可以是A&,也可以是constA&;** 2.如果同时存在两个拷贝构造函数,参数分别为A&和constA&,那么系统会根据实参类型选择拷贝构造函数 3.如果只使⽤⾮const参数的拷贝构造函数,那么程序在编译拷贝构造函数时需要常量,就会导致编译失败. **4.通常我们只编写⼀个带有const类型的拷贝构造函数,就可以适应所有情况了.**