我想知道为什么编译器提供默认的复制构造函数.这个想法背后的策略是什么.
提前致谢.
从一个相关的(但不是相同的)问题 - 为什么C++编译器不能定义operator ==和operator!=?:
Stroustrup在"C++的设计和演变"(第11.4.1节 - 复制控制)中说明了默认的复制构造函数:
我个人认为不幸的是,复制操作是默认定义的,我禁止复制我的许多类的对象.但是,C++从C继承了它的默认赋值和复制构造函数,并且它们经常被使用.
所以答案是Stroustrup不情愿地将其与C语言向后兼容(可能是大多数C++瑕疵的原因,但也可能是C++流行的主要原因).
出于我自己的目的,在我的IDE中,我用于新类的片段包含私有赋值运算符和复制构造函数的声明,这样当我生成一个新类时,我没有得到默认赋值和复制操作 - 我必须显式删除声明如果我希望编译器能够为我生成它们,那么来自private:section的那些操作.
从C++编程语言,第11.3.4节复制
...对于默认复制构造函数具有正确语义的类型,我更喜欢依赖于该默认值.它比我能写的任何东西都要简洁,人们应该理解默认值.此外,编译器了解默认值及其可能的优化机会.此外,手动写出成员副本对于具有许多数据成员的类来说是繁琐且容易出错的.
基本上,我读到这一点,因为默认的复制构造函数可以节省您的工作量,使您免于因繁琐而导致的错误,并通过消除手动优化它的诱惑(通过让编译器这样做)来帮助优化代码.
因为否则,当您按值传递实例时,编译器如何生成一个实例?