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

时间:2015-04-30 11:35:00

标签: c++ private copy-constructor

在2小时内我将参加C ++考试,我仍然想知道复制构造函数的语法。

到目前为止,我所理解的是你将CopyConstructor置于私有中,这样当一些函数或任何想要复制你的类的东西时,它就无法工作,因为它无法访问私有变量。因此,您可以检查是否遗漏了任何只能制作浅色副本的指针。

到目前为止一切顺利。

现在我读的语法是

ClassName(const ClassName &)

我想知道为什么你有那个&符号和那里的const。不只是ClassName(ClassName)就够了吗?

5 个答案:

答案 0 :(得分:2)

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

  

如果第一个参数的类型为XX&const X&volatile X&,则类const volatile X&的非模板构造函数是一个复制构造函数,并且没有其他参数,或者所有其他参数都有默认参数。

根据语言的定义,你的建议不会是复制构造函数。

事实上,根据[class.copy] / 6:

,你的建议是不正确的
  

如果类X的构造函数的第一个参数是类型(可选择cv-qualified)X并且没有其他参数或者所有其他参数,那么它的构造函数声明是错误的有默认参数。

答案 1 :(得分:1)

为了按值传递某些内容,您需要能够复制它。我们如何制作副本?复制构造函数当然!因此,如果我们定义像ClassName(ClassName)那样的复制构造函数,我们传入一个ClassName,调用复制构造函数,它调用复制构造函数...

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

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

ClassName (const Classname&) = delete;

答案 2 :(得分:1)

语法f(Classname)表示复制参数,而f(const Classname&)表示参数。

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

答案 3 :(得分:1)

const意味着你也可以复制一个不变的类(你承诺不会修改你要复制的类。

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

答案 4 :(得分:1)

  

我想知道为什么你有&符号和那里的常量

&符号表示要复制的对象通过引用传递。 const表示该引用无法用于修改它;这是你复制它时所期望的。

  

ClassName(ClassName)不仅仅是足够吗?

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

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

相关问题