Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么复制构造函数参数是常量?_C++_Constructor - Fatal编程技术网

C++ 为什么复制构造函数参数是常量?

C++ 为什么复制构造函数参数是常量?,c++,constructor,C++,Constructor,为什么参数是常量?因为您不打算在复制ctor内修改参数其他,因为它是常量 当您执行x=other.x时,它实际上意味着this->x=other.x。因此,您只需从其他变量复制值,即可修改此对象。由于other变量在这里是只读的,因此它作为常量引用传递。复制构造函数的思想是将other对象的内容复制到this对象中。const用于确保您不会修改其他对象。为了不能够(意外地)更改其他。这不是复制构造函数特有的。在任何函数中,如果您不打算修改对象的内部状态,则对象将作为const传递 Vector

为什么参数是常量?

因为您不打算在复制ctor内修改参数
其他
,因为它是常量


当您执行
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());