✅ 操作成功!

拷贝构造函数

发布时间:2023-06-07 作者:admin 来源:文学

拷贝构造函数

拷贝构造函数

电梯工程-草船借箭课文

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类型的拷贝构造函数,就可以适应所有情况了.**

👁️ 阅读量:0