从OpenCV源码学习cpp_const

来源:互联网 发布:ubuntu 列出所有用户 编辑:程序博客网 时间:2024/05/22 08:17

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修饰对象,同时不影响使用[]操作符。

0 0