C++ 为什么复制构造函数参数是常量?
为什么参数是常量?因为您不打算在复制ctor内修改参数C++ 为什么复制构造函数参数是常量?,c++,constructor,C++,Constructor,为什么参数是常量?因为您不打算在复制ctor内修改参数其他,因为它是常量 当您执行x=other.x时,它实际上意味着this->x=other.x。因此,您只需从其他变量复制值,即可修改此对象。由于other变量在这里是只读的,因此它作为常量引用传递。复制构造函数的思想是将other对象的内容复制到this对象中。const用于确保您不会修改其他对象。为了不能够(意外地)更改其他。这不是复制构造函数特有的。在任何函数中,如果您不打算修改对象的内部状态,则对象将作为const传递 Vector
其他
,因为它是常量
当您执行
x=other.x
时,它实际上意味着this->x=other.x
。因此,您只需从其他
变量复制值,即可修改此
对象。由于other
变量在这里是只读的,因此它作为常量引用传递。复制构造函数的思想是将other
对象的内容复制到this
对象中。const用于确保您不会修改其他
对象。为了不能够(意外地)更改其他
。这不是复制构造函数特有的。在任何函数中,如果您不打算修改对象的内部状态,则对象将作为const
传递
Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
你得到的答案提到了确保ctor不能改变被复制的内容——他们是对的,把常量放在那里确实有这种效果
然而,更重要的是,临时对象不能绑定到非常量引用。复制ctor必须引用常量对象才能复制临时对象。如果要复制仅具有常量引用的对象,例如,它也很方便
Vector(const Vector& other)
{
//Since other is const, only public data member and public methods which are `const` can be accessed.
}
如果不是针对
Vector(const-Vector&other)
,该示例将创建一个语法错误 出于上述原因,传统的复制ctor和friends采用了一个const&
参数。但是,您还应该查找并(如果一切顺利,作为C++0x的一部分)了解为什么以及何时将使用不带常量的copy-ctors&
参数。另一个需要研究的地方是智能指针的实现,例如(具有所有权转移语义),其中非常量参数非常有用。当我们尝试使用复制构造函数将一个对象复制到另一个对象时,我们需要维护原始对象的原始副本(我们正在复制)因此,在传递对象时,我们将其设置为常量,并将其作为一个by引用进行传递。通过(a)告诉调用者他们不必担心传入参数的更改,(b)这被认为是“良好的防御编程”告诉实现者不允许他们更改参数。这也是必要的,因为您希望能够将右值绑定到ctor的参数:X=f()代码>。这在非常量引用中是不可能的。由于向量
是向量
,您不能访问其他
的私有成员吗?。如果将Vector
参数替换为OtherClass
,则无法访问私有成员。@Jamura:您可以访问它们,但不允许修改它们。试图修改是一个编译时错误。应该是Vector(const-Vector&other):x(other.x),y(other.y){}
阅读初始化列表以及它们为什么好用:const-corrective可能是一个你想查找的术语,尽管它在99%的时间里是常量,但有一个反例;参见std::auto_ptr。当然,auto_ptr
是不受欢迎的,因为即使是标准委员会的专家也没有完全正确。因此,我想说,如果你找到一个复制构造函数的非常量参数,你可以相当肯定代码被破坏了。而且不仅仅是临时对象——它还允许复制构造函数用于恰好标记为常量的命名对象。这非常混乱。你能告诉我“const Vector&other”和“Vector const&other”之间的区别吗?@HoyCheung:它们之间没有区别。@HoyCheung放置常量
说明符的“可读”方式是在你想要创建的常量
类型之后。例如:int cont*cont
创建指向常量整数的常量指针(声明符的逆读取与您定义的类型匹配),但是第一个const
(如果有)也可以放在(const int*const
)之前,我认为这与C的原始版本有某种兼容性,或者只是为了传统。
...
const Vector& getPosition();
...
Vector* v = new Vector(getPosition());