在私有 class 语法中复制构造函数

Copy constructor in private class Syntax

2 小时后我将参加 C++ 考试,但我仍然对复制构造函数的语法感到疑惑。

到目前为止,我的理解是您将 CopyConstructor 置于私有状态,这样当某些函数或任何想要复制您的 class 时它不会工作,因为它无法访问私有变量。所以你可以检查你是否错过了任何只会制作浅拷贝的指针。

到目前为止一切顺利。

现在我读到的语法是

ClassName(const ClassName &)

我想知道为什么你有那个 & 符号和 const 在那里。仅仅 ClassName(ClassName) 不够吗?

为了按值传递某些东西,您需要能够复制它。我们如何制作副本?当然是拷贝构造函数!所以如果我们定义像ClassName(ClassName)这样的拷贝构造函数,我们传入一个ClassName,调用拷贝构造函数,它调用拷贝构造函数...

这导致无限递归;这不是一种非常合理的复制对象的方式。这就是我们通过引用传递的原因:因此我们不需要制作任何其他副本。 const 在那里是因为复制一个对象不应该修改它,否则你会得到像 auto_ptr.

这样可怕的东西

此外,对于 C++11,最好使用 =delete 来阻止人们复制您的 class 而不是将复制构造函数设为私有:

ClassName (const Classname&) = delete;

语法 f(Classname) 表示参数被复制,而 f(const Classname&) 表示对参数的引用。

然而,复制提供给复制构造函数的参数是非常糟糕的,它应该定义如何制作这样的副本...

const 意味着您还可以复制一个不变的 class(并且您承诺不会修改您正在复制的 class。

& 符号 & 意味着你的复制构造函数引用了它试图复制的东西(没有 & 符号它会得到它的副本,这是不可能的,因为我们实际上正在尝试制作副本)。

来自 C++14 中的 [class.copy]/2:

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments .

因此根据语言的定义,您的建议不是复制构造函数。

事实上根据 [class.copy]/6 你的建议是错误的:

A declaration of a constructor for a class X is ill-formed if its first parameter is of type (optionally cv-qualified) X and either there are no other parameters or else all other parameters have default arguments.

I wondered why you have that ampersand and the const in there

& 符号表示要复制的对象是通过引用传递的。 const 表示引用不能修改;这就是您复制它时所期望的。

Would not just ClassName(ClassName) be enough?

这意味着对象是按值传递的。为此,必须复制它。要复制它,您必须调用复制构造函数。为此,您必须按值传递对象。为此,必须复制它。等等。

所以不,复制构造函数不能按值获取其参数。