Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
为什么参数是const?
答案 0 :(得分:57)
你已经得到了答案,提到确保ctor不能改变被复制的东西 - 而且他们是对的,把const放在那里确实有这种效果。
但更重要的是,临时对象无法绑定到非const引用。复制文件必须引用const对象才能复制临时对象。
答案 1 :(得分:20)
因为你不打算修改复制文件中的参数other
,因为它是const。
当你x = other.x
时,它实质上意味着this->x = other.x
。因此,仅通过复制this
变量中的值仅修改other
对象。由于other
变量在此处是只读的,因此它将作为const-ref传递。
答案 2 :(得分:3)
传统的copy-ctor和朋友出于上面指定的原因而采用const&
参数。但是,您还应该查找move-semantics和r-value references(如果一切顺利的话,成为C ++ 0x的一部分),看看为什么以及何时使用没有{{1}的副本参数。另一个需要考虑的地方是智能指针的实现,例如auto_ptr
(它具有所有权语义的转移),其中非const参数是有用的。
答案 3 :(得分:1)
为了不能够改变other
(偶然)?
答案 4 :(得分:1)
当我们尝试使用复制构造函数将一个对象复制到另一个对象时,我们需要维护原始对象的原始副本(我们正在复制),因此在传递对象时我们将其保持为常量并将其作为引用传递给它。 / p>
答案 5 :(得分:0)
复制构造函数的想法是将other
对象的内容复制到this
对象中。 const用于确保您不会修改other
对象。
答案 6 :(得分:0)
它不是特定于复制构造函数。在任何函数中,如果您不打算修改对象的内部状态,那么对象将作为const
传递。
Vector(const Vector& other)
{
//Since other is const, only public data member and public methods which are `const` can be accessed.
}
答案 7 :(得分:0)
如果你想复制一个只有const引用的对象,例如
,它也会派上用场...
const Vector& getPosition();
...
Vector* v = new Vector(getPosition());
如果不是Vector(const Vector& other)
该示例会产生语法错误。