在私有 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?
这意味着对象是按值传递的。为此,必须复制它。要复制它,您必须调用复制构造函数。为此,您必须按值传递对象。为此,必须复制它。等等。
所以不,复制构造函数不能按值获取其参数。
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 typeX&
,const X&
,volatile X&
orconst 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?
这意味着对象是按值传递的。为此,必须复制它。要复制它,您必须调用复制构造函数。为此,您必须按值传递对象。为此,必须复制它。等等。
所以不,复制构造函数不能按值获取其参数。