复制构造函数的参数

yel*_*key 6 c++ copy-constructor

为什么使用对复制构造函数参数的引用?

找了很多资料说是为了避免无限通话,但是还是看不懂。

Jas*_*ent 7

当您按值传递给方法时,参数会生成一个副本。复制使用复制构造函数,因此您会遇到对复制构造函数进行无限递归调用的鸡和蛋的情况。

回复评论:

通过引用传递不会使对象的副本开始传递。它只是传递对象的地址(隐藏在引用语法后面),因此复制构造函数内的对象(或通过引用传递对象的任何方法)与外部的对象是相同的对象。

除了在这里解决鸡和蛋的问题外,通过引用传递通常(对于更大的对象 - 大于一个点的大小)更快。

对进一步评论的回应:

您可以编写一种通过指针传递的复制构造函数,它的工作方式与通过引用传递的方式相同。但是显式调用会很麻烦,而隐式调用是不可能的。

宣言:

class X
{
public:
    X();
    X(const X* const pOther);
};
Run Code Online (Sandbox Code Playgroud)

显式副本:

X x1;

X x2(&x1);  // Have to take address
Run Code Online (Sandbox Code Playgroud)

隐式副本:

void foo (X copyOfX);   // Pass by value, copy made

...

X x1;

foo (x1);  // Copy constructor called implicitly if correctly declared
           // But not matched if declared with pointer

foo (&x1); // Copy construcxtor with pointer might (?) be matched
           // But function call to foo isn't
Run Code Online (Sandbox Code Playgroud)

最终,这样的东西不会被视为 C++ 复制构造函数。

  • 此外,它还会违背复制构造函数的目的,即从原始文件(通过引用传递)创建副本,而不是依赖其他东西来制作所述副本。 (2认同)

小智 5

这段代码:

class MyClass {
public:
  MyClass();
  MyClass(MyClass c);
};
Run Code Online (Sandbox Code Playgroud)

不编译。也就是说,因为这里的第二行:

MyClass a;
MyClass b(a);
Run Code Online (Sandbox Code Playgroud)

理论上应该导致您正在谈论的无限循环 - 它应该a在调用构造函数之前构造 to的副本for b。但是,如果复制构造函数如下所示:

  MyClass(const MyClass& c);
Run Code Online (Sandbox Code Playgroud)

然后在调用复制构造函数之前不需要进行复制。