关于c ++:复制带有多个参数的构造函数

Copy constructor with more than one parameter

我正在学习C++,并从EDCOX1 0中读取复制构造函数。书上说

It is permissible for a copy constructor to have additional parameters as long as they have default arguments defined for them. However, in all cases the first parameter must be a reference to the object doing the initializing.

但我很困惑,我们将如何通过这些附加参数?我相信应该有一些方法是书中没有给出的,我也不知道。有人能帮我吗?

编辑:另外,在这三种情况下是否可以传递这些额外的参数,即

  • 当一个对象显式初始化另一个对象时,例如在声明中
  • 当对象的副本被传递给函数时
  • 生成临时对象时(通常作为返回值)


下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
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,这意味着默认的复制构造函数将很浅。

1
2
A b(a_var);       // b gets a shallow copy of a
foo(b);           // foo() receives a shallow copy

但是,可以通过在第二个参数中传递true来实现深度复制。

1
2
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

同样,对于返回A的函数,返回的副本将很浅,因为它使用默认值,但是接收器在接收到时可以使其变深。

1
2
A b(bar());       // shallow
A b(bar(), true); // deep

记住,当您定义一个复制构造函数时,很可能意味着您需要定义一个析构函数并重载赋值运算符(三个规则)。


这样想:只有构造函数的概念。当编译器决定需要创建一个副本时,它会寻找一个可以通过传入一个T类型的单个对象来调用的构造函数。由于这个特殊的用例,我们通常称构造函数为"复制"构造函数。