为什么复制构造函数参数为const?
Vector(const Vector& other) // Copy constructor { x = other.x; y = other.y;
为什么参数是一个const?
你已经得到了答案,提到确保ctor不能改变被复制的东西 – 他们是正确的,把const放在那里确实有这个效果。
更重要的是,临时对象不能绑定到非const引用。 复制ctor必须引用一个const对象才能复制临时对象。
因为你不会修改other
参数,因为它是const。
当你做x = other.x
它基本上意味着this->x = other.x
。 所以你只是通过复制other
variables的值来修改this
对象。 由于other
variables在这里是只读的,所以它作为const-ref传递。
传统的copy-ctor和朋友由于上述原因需要一个const&
参数。 但是,您还应该查看移动语义和r值引用 (如果一切顺利,请成为C ++ 0x的一部分)来查看为什么以及何时使用不带const&
参数的copy-ctors。 另一个需要考虑的地方是智能指针的实现,例如auto_ptr
(它拥有所有权语义的转移),其中非常量参数是有用的。
为了不能改变other
(偶然)?
当我们试图使用拷贝构造函数将一个对象复制到另一个对象时,我们需要保留原始对象(我们正在拷贝)的原始拷贝,所以在传递对象的时候我们使它保持不变,并且把它作为引用传递。
复制构造函数的思想是将other
对象的内容复制到this
对象中。 常量是在那里确保你不修改other
对象。
它不特定于复制构造函数。 在任何函数中,如果不打算修改对象的内部状态,则对象将作为const
传递。
Vector(const Vector& other) { //Since other is const, only public data member and public methods which are `const` can be accessed. }
例如,如果你想复制一个只有const引用的对象,它也可以派上用场
... const Vector& getPosition(); ... Vector* v = new Vector(getPosition());
如果不是Vector(const Vector& other)
,那么这个例子会产生一个语法错误。