从OpenCV源码学习cpp_const

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值