为什么copy-constructor参数为const?

时间:2009-10-21 16:42:19

标签: c++ constructor

 Vector(const Vector& other) // Copy constructor 
 {
    x = other.x;
    y = other.y;

为什么参数是const?

8 个答案:

答案 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-semanticsr-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)该示例会产生语法错误。