C++中的引用与const
2016-04-28 13:59
435 查看
C++中引用与const的组合很容易引起困扰,这篇文章将对这一问题进行简要介绍。
首先,要明确一些原则:
(1) const是限定符,可以放在引用符&,指针符*的后面,比如:*const,&const;而int是类型符,不能放在&和*的后面,比如:*int,&int都会出错。
(2) 引用必须初始化,且初始化后不能更改绑定,因此,引用与生俱来便具备const的性质。
(3) &const r = i 实际上是限定了不能修改r的绑定(并非与r绑定的变量i的值),而C++已经规定了引用r本身不能更改绑定,因此这里添加const修饰是多余的。&const r 等价于 &r。
假设有int i = 40,引用与const的可能的组合形式有如下几种:
(1) const int &r = i; 正确,不能修改r,可以修改i
(2) int const &r = i; 正确,与(1)等价
(3) const int const &r = i; 警告,多次使用同一类型限定符,实际上与(1)和(2)等价
(4) int &const r = i; 等价于int &r = i,可以修改r(不能更改r的绑定,但可以通过r修改变量i的值),也可以修改i。出现警告:使用了记时错误: 忽略引用上的限定符。
(5) const int &const r = i; 等价于(1),出现警告:使用了记时错误: 忽略引用上的限定符。
假设有const int i = 40,引用与const的可能的组合形式有如下几种:
(1) const int &r = i; 正确,不能修改r,不能修改i
(2) int const &r = i; 正确,与(1)等价
(3) const int const &r = i; 警告,多次使用同一类型限定符,实际上与(1)和(2)等价
(4) int &const r = i; 错误:无法从“const int”转换为“int &”
(5) const int &const r = i; 等价于(1),出现警告:使用了记时错误: 忽略引用上的限定符。
首先,要明确一些原则:
(1) const是限定符,可以放在引用符&,指针符*的后面,比如:*const,&const;而int是类型符,不能放在&和*的后面,比如:*int,&int都会出错。
(2) 引用必须初始化,且初始化后不能更改绑定,因此,引用与生俱来便具备const的性质。
(3) &const r = i 实际上是限定了不能修改r的绑定(并非与r绑定的变量i的值),而C++已经规定了引用r本身不能更改绑定,因此这里添加const修饰是多余的。&const r 等价于 &r。
假设有int i = 40,引用与const的可能的组合形式有如下几种:
(1) const int &r = i; 正确,不能修改r,可以修改i
(2) int const &r = i; 正确,与(1)等价
(3) const int const &r = i; 警告,多次使用同一类型限定符,实际上与(1)和(2)等价
(4) int &const r = i; 等价于int &r = i,可以修改r(不能更改r的绑定,但可以通过r修改变量i的值),也可以修改i。出现警告:使用了记时错误: 忽略引用上的限定符。
(5) const int &const r = i; 等价于(1),出现警告:使用了记时错误: 忽略引用上的限定符。
假设有const int i = 40,引用与const的可能的组合形式有如下几种:
(1) const int &r = i; 正确,不能修改r,不能修改i
(2) int const &r = i; 正确,与(1)等价
(3) const int const &r = i; 警告,多次使用同一类型限定符,实际上与(1)和(2)等价
(4) int &const r = i; 错误:无法从“const int”转换为“int &”
(5) const int &const r = i; 等价于(1),出现警告:使用了记时错误: 忽略引用上的限定符。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Python动态类型的学习---引用的理解
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- Shell脚本中引用、调用另一个脚本文件的2种方法
- vbs引用另一个vbs的代码
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法