Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
为什么这个参数被声明为 const?
Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
为什么这个参数被声明为 const?
你已经得到了提到确保构造函数无法更改被复制的内容的答案,他们是正确的,放置const确实可以产生这种效果。
然而,更重要的是临时对象无法绑定到非const引用。复制构造函数必须接受对const对象的引用,才能够复制临时对象。
const
的类型后面加上const
关键字。例如:int const * const
可以创建一个指向常量整数的常量指针(声明符的反向阅读匹配你正在定义的类型)。但是第一个const
(如果有的话)也可以放在前面(const int * const
),我认为这是为了与C语言的原始版本兼容,或者仅仅是出于传统习惯。 - ABuother
,所以在复制构造函数内部不会进行修改。x = other.x
时,它实际上意味着this->x = other.x
。因此,您只是通过从变量other
复制值来修改this
对象。由于此处的other
变量是只读的,因此将其作为const-ref传递。X x = f();
。使用非const引用无法实现这一点。 - sbi为了防止意外更改其他
,该怎么做?
这不仅适用于复制构造函数。在任何函数中,如果您不打算修改对象的内部状态,则应将该对象作为const
传递。
Vector(const Vector& other)
{
//Since other is const, only public data member and public methods which are `const` can be accessed.
}
Vector
是一个Vector
,所以你可以访问other
的私有成员吗?如果你用OtherClass
替换Vector
参数,你就不能访问私有成员了。 - jamuraa如果你只有一个常量引用,但想要复制一个对象,这也会很方便。
...
const Vector& getPosition();
...
Vector* v = new Vector(getPosition());
Vector(const Vector& other)
,该示例将会产生语法错误。
Vector(const Vector& other) : x(other.x), y(other.y) {}
。了解初始化列表及其好处,请参阅:https://dev59.com/x3I-5IYBdhLWcg3w8dYQ。 - sbiauto_ptr
已经被弃用了,因为即使是标准委员会的专家也没有完全搞清楚它。因此,我认为如果你发现一个复制构造函数的非const参数,你可以相当确定代码是有问题的。 - celtschk