为什么拷贝构造函数的参数一定是引用类型

2024-11-29 10:27:28
推荐回答(2个)
回答1:

从语言规范的角度来说,这只是一种规定而已。
C++标准12.8第2段提到:
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments.
翻译过来就是:
如果类X的一个非模板构造函数的第一个参数的类型是 X&,const X&,volatile X& 或 const volatile X& 中的一个,而且这个构造函数要么没有其他参数,要么其他参数都有默认值,那么这个构造函数就是拷贝构造函数。
这是人为的规定。

从逻辑的角度来说,因为从参数的传递本身就是拷贝。如果不使用引用类型,拷贝构造函数传递参数时又会调用拷贝构造函数,造成循环调用。

回答2:

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第一感觉也是这么回答。不好还好,我有理性这个好品质。思索一下以后,发现这个答案是不对的。让我来撕开(有点暴力,但是我喜欢,嘿嘿--龇牙)那件隐藏在真理外的小裤衩,让它袒露在“登徒子”们的眼前吧。 先从一个小例子开始:(自己测试一下自己看看这个程序的输出是什么?) view plaincopy to clipboardprint?#include class CExample { int m_nTest; public: CExample(int x):m_nTest(x) //带参数构造函数 { cout