为何默认拷贝构造函数可拷贝const或引用成员,默认拷贝赋值运算符却不行?
class Test{ int num; const int constVal; int& ref; public: Test(int a):constVal(2),ref(a){ std::cout<<"create"<<std::endl; } }; int main() { int a=23; Test tOne(a); Test tTwo=tOne; return 0; }
为什么含const/引用成员的类默认拷贝构造可行,拷贝赋值却不行?
核心原因是拷贝构造和拷贝赋值的本质操作完全不同:
默认拷贝构造做的是初始化新对象的成员:
- 对于
const成员:const对象允许在创建时被初始化赋值,只是后续不能修改。默认拷贝构造会直接把源对象的const成员值作为新对象const成员的初始值,完全符合规则。 - 对于引用成员:引用必须在初始化阶段绑定对象,默认拷贝构造会让新对象的引用直接绑定到源对象引用指向的目标上,满足引用的初始化要求。
- 对于
默认拷贝赋值做的是给已存在的成员赋值:
- 对于
const成员:const对象一旦初始化就不能被修改,赋值操作本质是试图改变它的值,违反const语义,所以编译器不会生成默认拷贝赋值运算符。 - 对于引用成员:引用绑定后无法变更指向的对象,赋值操作试图修改引用的绑定目标,这是C++语法不允许的,因此编译器也不会生成默认拷贝赋值。
- 对于
简单总结:拷贝构造是“从零创建新对象并设置成员初始值”,拷贝赋值是“给已初始化的成员修改值”,两者面对const和引用的规则约束完全不同,所以行为自然不一致。
内容的提问来源于stack exchange,提问作者Hee
相关产品推荐
相关产品推荐

