复制构造函数的参数

Arguments for the copy constructor

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

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

此代码:

class MyClass {
public:
  MyClass();
  MyClass(MyClass c);
};

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

MyClass a;
MyClass b(a);

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

  MyClass(const MyClass& c);

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

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

回复评论:

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

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

对进一步评论的回复:

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

声明:

class X
{
public:
    X();
    X(const X* const pOther);
};

显式复制:

X x1;

X x2(&x1);  // Have to take address

隐式副本:

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

这样的东西总归不会被当做C++拷贝构造函数吧

由此webpage

A copy constructor is called when an object is passed by value. Copy constructor itself is a function. So if we pass an argument by value in a copy constructor, a call to copy constructor would be made to call copy constructor which becomes a non-terminating chain of calls. Therefore compiler doesn’t allow parameters to be passed by value.

通过按值传递参数,复制构造函数调用自身,进入无限'recursion cycle'。上面的 link 很好地解释了有关复制构造函数的基本主题。