C++ 拷贝构造函数、赋值运算符=的调用时机

本文通过示例代码详细解析了C++中拷贝构造函数与赋值操作符的使用场景及其工作原理,展示了不同情况下如何触发这些成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

至于这两种函数的用途,用于引用计数时比较有用吧,完成一些在堆上分配的数据的传递工作。[url]http://xinklabi.iteye.com/blog/653457[/url]


啥也不说了,直接上代码;注释很详细了

#include <iostream>
using namespace std;

class Class{

public:
Class(){
}
//如果用 explicit Class(const Class& c){ 来声明,则不能用Class c1=c;而只可以Class c2(c);
Class(const Class& c){
cout<<"copy construnctor called\n";
}


//=的调用者本身就是个Class类!该函数只是为了自行完成一些数据传递的任务,最后返回该调用者的引用即可
Class& operator=(const Class& c){
cout<<"= operator called\n";
return *this;
}

//函数返回时调用拷贝构造函数
static Class getClass(){
cout<<"begin getClass\n";

Class c;
cout<<"end of getClass,soon to return\n";
return c;

}

};

//类作为参数,进入函数时会调用拷贝构造函数
void classAsParam(Class c){
cout<<"begin classAsParam\n";
}

//类的引用作为参数,进入函数时不会调用拷贝构造函数
void classReferenceAsParam(Class& c){
cout<<"begin classReferenceAsParam\n";
}


void main(){
Class c;

Class c1=c;//因为是初始化,调用的是拷贝构造函数,而非=运算符
Class c2(c);//同上

cout<<"\n Test getClass without return value\n";
Class::getClass();//函数返回时调用拷贝构造函数

cout<<"\n Test getClass with new left value\n";
Class c3=Class::getClass();//函数返回时调用拷贝构造函数;由于c3在此声明,因而再调用拷贝构造函数(貌似被编译器省略了)

cout<<"\n Test getClass with exist left value\n";
c2=Class::getClass();//函数返回时调用拷贝构造函数;由于c2已经声明过,因而再调用=运算符将临时变量赋值给c2

cout<<"\n Test classAsParam\n";
classAsParam(c);//类作为参数,进入函数时会调用拷贝构造函数

cout<<"\n Test classReferenceAsParam\n";
classReferenceAsParam(c);//类的引用作为参数,进入函数时不会调用拷贝构造函数
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值