cpp中的const的用法,似乎有些复杂。const告诉编译器,我希望指定某种不被修改的东西,而具体是什么东西不被修改,则根据const的位置决定。
template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
{
public:
...
Vec mul(const Vec<_Tp, cn>& v) const; // 1
/*! element access */
const _Tp& operator [](int i) const; // 2
_Tp& operator[](int i);
...
};
修饰函数的参数类型
Vec mul(const Vec<_Tp, cn>& v) const; // 1
这很好理解,Vec前面的const,修饰了v,v在这个方法内部是不可改变的。
修饰类的成员函数
Vec mul(const Vec<_Tp, cn>& v) const; // 1
const修饰的mul方法,使得这个方法内部是无法修改当前对象(this指针指向的对象)的数据成员。实际上,这个const的实质作用效果是,把this指针变成const型,所以this指向的成员变量也都带上了const的约束。
修饰成员函数的返回值类型
const _Tp& operator [](int i) const; // 2
当函数返回的变量是const时,就需要在返回值类型前面添加const修饰符。这种情况下这个const如果省略,会报错,因为返回值本身已经是const型。在这个例子中,返回值是成员变量,由于this已被const修饰,所以这里的const不能省略。
当然如果返回值不是const,也可以添加const,把返回值变成const型。
另外
const _Tp& operator [](int i) const; // 2
_Tp& operator[](int i);
常常这两句话同时出现,什么时候决定调用哪个呢?取决于this指针是不是const型。
const Vec v1;
Vec v2;
v1的this指针是const型,v1[i]会调用第一句;而v2不是,v2[i]会调用第二句。换一个角度讲,只有同时定义了这两句话,才可以自由地选择是否使用const修饰对象,同时不影响使用[]操作符。