数定义上const不同位置的不同作用以及报错记录

函数定义

const cv::RotatedRect* getRect(); 
cv::RotatedRect* const getRect();
cv::RotatedRect* getRect() const;

作用

  • const cv::RotatedRect* getRect();
    代表函数的返回值内容不能改变,此处为指针的指向不能改变,但是指向对象的内容可以改变
  • cv::RotatedRect* const getRect();
    如果函数返回值为指针,则代表返回的指针指向的对象内容不能改变,但是指针指向可以变
  • cv::RotatedRect* getRect() const;
    代表函数内部不能对调用该函数对象内的实例成员变量做修改,也就是getRect()内部不能修改该类中任何实例变量,这里const本质上是修饰函数传入的this指针

报错记录

  • passing ‘const XXX*’ as ‘this’ argument discards qualifiers
    原因:返回了const的指针后,用该指针调用了non-const的成员函数,系统无法保证成员函数不修改成员变量。
    修改:将调用的成员函数改为xxx() const;或者去掉const的修饰

  • invalid conversion from ‘const XXX*’ to ‘XXX*’
    原因:在函数最后加了const修饰不想在函数中修改成员变量,但是const会修饰this指针使返回的指针为const,但是函数前没加const,系统认为你想从non-const变量转换成const
    修改:在函数前面加上const或者删去函数后面的const

总结

最左不能修改返回值内容,中间不能修改返回指针指向的内容,最右不能在函数内修改成员变量。



类型声明中const用来修饰一个常量,有如下两种写法:

1)、const在类型前面

const int nValue; //nValue是const

const char *pContent; //*pContent是const, pContent可变

const (char *) pContent;//pContent是const,*pContent可变

char* const pContent; //pContent是const,*pContent可变

const char* const pContent; //pContent和*pContent都是const

2)、const在类型后面

int const nValue; // nValue是const

char const * pContent;// *pContent是const, pContent可变

(char *) const pContent;//pContent是const,*pContent可变

char* const pContent;// pContent是const,*pContent可变

char const* const pContent;// pContent和*pContent都是const

我的判断原则:

如果const位于的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于的右侧,const就是修饰指针本身,即指针本身是常量。另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。



一个比较经典的问题——问以下两种声明的区别

  1. const char * p
  2. char * const p

这里的 const 关键字是用于修饰常量,书上说 const 将修饰离它最近的对象,所以,以上两种声明的意思分别应该是:

  1. p 是一个指向常量字符的指针,不变的是 char 的值,即该字符的值在定义时初始化后就不能再改变。
  2. p 是一个指向字符的常量指针,不变的是 p 的值,即该指针不能再指向别的。

现在倒是正确说出了两者的意思,但应该怎样记忆它们呢?
至少我觉得我经常会忘记,以后再遇到了可能又会混淆不清。-_- !

无意间,在网上看到有人介绍了一种不错的记忆方法,分享如下:

Bjarne 在他的《The C++ Programming Language》里面给出过一个助记的方法——“以 * 分界,把一个声明从右向左读”。
注意语法,* 读作 pointer to (指向…的指针),const (常量) 是形容词,char (变量类型) 和 p (变量名) 当然都是名词。

  1. const char * p 读作:p is a pointer to a const char,译:p 是一个指针(变量),它指向一个常量字符(const char)。
  2. char * const p 读作:p is a const pointer to a char,译:p 是一个常量指针(const p),它指向一个字符(变量)。

从两处蓝色标记也能看出前面提到的“const 修饰离开最近的对象”的说法。

另外请再注意下面的情况。
先看 const int a 和 int const a,这里没有分界符 *,虽然 const 的位置不同,但意思不变,它 const 修饰的是 int,常量整数。
再看 const char * p 和 char const * p,首先以 * 分界,虽然 const 的位置改变了,但它都是在修饰 char,常量字符。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值