我正在学习 C++,并且正在从C++: The Complete Reference. 书上说
只要为它们定义了默认参数,复制构造函数就可以具有附加参数。但是,在所有情况下,第一个参数都必须是对进行初始化的对象的引用。
但我很困惑我们将如何传递这些额外的参数?我相信应该有一些书中没有给出并且我无法弄清楚的方法。谁能帮我吗?
编辑: 也可以在所有三种情况下传递这些额外的参数,即
- 当一个对象显式初始化另一个对象时,例如在声明中
- 将对象的副本传递给函数时
- 生成临时对象时(最常见的是,作为返回值)
我正在学习 C++,并且正在从C++: The Complete Reference. 书上说
只要为它们定义了默认参数,复制构造函数就可以具有附加参数。但是,在所有情况下,第一个参数都必须是对进行初始化的对象的引用。
但我很困惑我们将如何传递这些额外的参数?我相信应该有一些书中没有给出并且我无法弄清楚的方法。谁能帮我吗?
编辑: 也可以在所有三种情况下传递这些额外的参数,即
这是一个简单的例子:
class A {
//...
public:
A (const A&, bool deep = false) {
if (!deep) { /* make a shallow copy */ }
else { /* make a deep copy */ }
}
};
void foo (A x) { /*...*/ }
A bar () { /*...*/ return A(); }
A a_var;
在此示例中,参数默认为 false,这意味着默认的复制构造函数将是浅的。
A b(a_var); // b gets a shallow copy of a
foo(b); // foo() receives a shallow copy
但是,可以通过在第二个参数中传入 true 来实现深层复制。
A b(a_var, true); // b gets a deep copy of a
foo(A(b, true)); // foo receives a shallow copy of a deep copy
类似地,对于返回 an 的函数A,返回的副本将是浅的,因为它使用默认值,但接收者可以在接收到它时使其变得深。
A b(bar()); // shallow
A b(bar(), true); // deep
请记住,当您定义复制构造函数时,很可能意味着您需要定义析构函数并重载赋值运算符(三规则)。
这样想:只有构造函数的概念。当编译器决定需要进行复制时,它会寻找一个构造函数,该构造函数可以通过传入一个类型的对象来调用T。由于这种特殊的用例,我们通常将选择的构造函数称为“复制”构造函数。