C++中`Request r2 = r1;`调用拷贝构造还是赋值运算符?
结论
首先纠正题干笔误:r1是Connection类型实例,语句里的Request r2 = r1属于类名书写错误,实际应为Connection r2 = r1。该语句调用的是拷贝构造函数,完全不会触发赋值运算符operator=。
判断依据
C++对拷贝构造和赋值运算符的触发场景有非常明确的划分:
- 拷贝构造函数的服务场景是新对象的初始化:只要是在声明新变量的同一行完成初始值设置,哪怕语法上用了
=符号,也属于拷贝初始化流程,直接匹配拷贝构造函数。 - 赋值运算符
operator=的服务场景是已存在对象的值更新:只有当对象已经走完所有构造流程、成为有效实例之后,再对其赋新值时,才会调用这个运算符。
场景对比
用几行代码就能把两者的区别说清楚:
Connection r1; // 调用普通默认构造函数 Connection r2 = r1; // 声明新对象r2并初始化,调用拷贝构造函数 Connection r3(r1); // 显式传参调用拷贝构造,和上一行逻辑完全等价 r2 = r1; // r2早就构造完成,这里才会调用赋值运算符operator=
这里最容易踩的误区就是被表面的
=符号误导,以为带等号就是赋值操作。实际上C++编译器会严格区分「声明时初始化」和「声明后赋值」两个完全不同的阶段,不会因为符号写法相同就混用逻辑。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

