复制具有多个参数的构造函数

时间:2012-06-08 05:27:34

标签: c++ copy-constructor

我正在学习C ++,正在从C++: The Complete Reference读取复制构造函数。书上写着

  

允许复制构造函数具有其他参数,只要它们具有为其定义的默认参数即可。但是,在所有情况下,第一个参数必须是对执行初始化的对象的引用。

但我很困惑,我们将如何传递这些额外的参数?我相信应该有一些方法没有在书中给出,我无法弄清楚。任何人都可以帮助我吗?

修改 也可以在所有三种情况下传递这些额外参数,即

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

2 个答案:

答案 0 :(得分:13)

这是一个简单的例子:

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

类似地,对于返回A的函数,返回的副本将是浅的,因为它使用默认值,但接收者可以在接收它时将其设置为深。

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

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

答案 1 :(得分:1)

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