C++ const 关键字问题

AirT
  • 98

有一个类 Edge:

class Edge {};

下面代码,我的理解是,有一个指向 b 的地址引用的指针变量 a

Edge b;
Edge* const &a = &b;

那么有个疑问,const 的位置能否提前(C++ 中是否存在这种语法),类似:

const Edge* &a = &b;        // 这段代码我测试是编译不过的
const Edge* const &a = &b;  // 但是如果后面的 const 保留就可以编译过了

我没有搜到相关的资料,希望能够得到各位道友指点解惑。

回复
阅读 1.3k
3 个回答
✓ 已被采纳

从右往左读,*做分割。

int const * 是指向 const int 的指针。

int * const 是const 指针指向int。

int const * const * 是指向(指向const int 的 const 指针)的指针。

const* 左边的时候修饰的是左边的类型,const* 右边的时候修饰的是指针。

特地来回复一下博主,这个问题我也是被困惑已久,但是在StackOverflow里看到的一篇文章我感觉很不错,在这里分享一下
首先发一下原帖小问题

判断一个变量的类型,可以使用螺旋法则根据下面三个步骤进行

步骤

1.
首先从你要解释的变量开始,顺时针移动
当遇到【x】或者【】时候,解释为有x个元素的数组或者未定义元素个数的数组
当遇到(type1,type2)类型的时候,解释为接收type1和type2参数的且返回…的一个函数
当遇到*时,解释为一个指向…类型的指针
2.
顺时针进行这个步骤直到最后一个判断完成
3.
总是先解决函数中的问题

空说无意义,我们来看一些例子(摘自上面链接里的文章)

例子

例一
先从str入手,顺时针到达【10】,即解释为str是一个有十个元素的数组,这个数组元素是一个指向char类型的指针,因此可以理解为指针数组

例二
先从fp入手,顺时针到达自己的括号,跳过,然后是一个指针,即理解为fp是一个指针,再顺时针转向一个括号(int,float),这个意味着指针指向的元素是一个接收int和float类型的函数,且这个函数返回值是char*类型。
总结一下,fp是一个指向函数指针,指向的函数具有如上的特性。

例三
首先从signal入手,顺时针转到(int,type),表示signal是一个接受两个参数的函数,参数一为int类型,参数二为一个函数指针,这个函数指针接收int类型而且没有返回值(其实重复上述步骤即可得知参数二的类型)。接着回到总函数,这个接受两个参数的signal将会返回一个指针,指针指向一个函数指针,这个函数指针接收int类型,且没有返回值。
综上所述,signal是一个函数,这个函数接受两个参数,一个为int,一个为接收int无返回的函数指针,并且signal的返回值是一个接收int无返回的函数指针。

结尾

这一法则可以用来判断变量的类型,也可以用来分辨函数指针之类的(个人从这里总结出来),博主可以试一下,还是蛮有意思的

《C++ Primer》是本好书,可以仔细读读。

你的问题可以阅读:

  • 第 3 版 3.5 const 限定修饰符
  • 第 5 版 7.3.5 指针和 const

讲的都是 const 指针和指向 const 的指针,应该会有所帮助

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏