在2小时内我将参加C ++考试,我仍然想知道复制构造函数的语法。
到目前为止,我所理解的是你将CopyConstructor置于私有中,这样当一些函数或任何想要复制你的类的东西时,它就无法工作,因为它无法访问私有变量。因此,您可以检查是否遗漏了任何只能制作浅色副本的指针。
到目前为止一切顺利。
现在我读的语法是
ClassName(const ClassName &)
我想知道为什么你有那个&符号和那里的const。不只是ClassName(ClassName)就够了吗?
答案 0 :(得分:2)
来自C ++ 14中的[class.copy] / 2:
如果第一个参数的类型为
X
,X&
,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
意味着你也可以复制一个不变的类(你承诺不会修改你要复制的类。
&
表示你的复制构造函数会引用它试图复制它的东西(没有&符号它会得到它的副本,这是不可能的,因为我们实际上正在尝试制作副本)。
答案 4 :(得分:1)
我想知道为什么你有&符号和那里的常量
&符号表示要复制的对象通过引用传递。 const
表示该引用无法用于修改它;这是你复制它时所期望的。
ClassName(ClassName)
不仅仅是足够吗?
这意味着对象按值传递。要做到这一点,就必须复制它。要复制它,您必须调用复制构造函数。为此,您必须按值传递对象。要做到这一点,就必须复制它。等等。
所以不,复制构造函数不能按值获取其参数。