关于运算符重载定义中的const

时间:2011-10-12 13:52:48

标签: c++ operator-overloading const

对于

的以下定义
const vector3F operator*(const vector3F &v, float s);

有两个const,它们各自的用法是什么?

2 个答案:

答案 0 :(得分:4)

参数中的const-reference意味着您不会更改v,因此您可以将常量向量(和临时值!)传递给函数。那是件好事。

恒定的按值返回是一种噱头。它阻止你写这样的东西:

 vector3F v = get_vector();
 vector3F w = v;

 (v * 1.5) = w; // outch! Cannot assign to constant, though, so we're good.

将by-value作为常量返回是有问题的,因为它会干扰C ++ 11的右值引用并移动语义:

 move_me(v * 1.5);  // cannot bind to `vector3F &&` :-(

正因为如此,并且因为像我上面所展示的那样的滥用是不太可能偶然发生的,所以最好只按价值返回非常数。

答案 1 :(得分:0)

第一个const表示返回值是常量且不能更改(顺便说一句,这对于乘法运算符来说是一个坏主意):

const Vector3F v = myvector*100.0;

v.x = 0; // error: the vector is constant and can not be altered

第二个const表示参数“v”是常数:

const vector3F operator*(const vector3F &v, float s)
{
    v.x = 0; // error: "v" is constant
}