C++中的常量(一) const限定符
最近在重新看<<C++ Primer>>,第一遍的时候const和constexpr看得并不太懂,这次又有了些更新的理解,当然可能仍然有许多不对的地方...
首先,const限定符即“常量”,一旦使用了const,那么对象的值不能再改变,比如:
const int i=1;
同时,const修饰的变量必须初始化,因为如果不初始化,那么就永远无法初始化了。
常量的初始化并不一定需要用常量,字面值或者是普通对象都是可以的,例如:
int i=5;
const int j=i;
const最难理解的是用于指针和引用,以及函数输入参数的类型、类成员函数。
首先对于指针类型,主要有这两种:
1.const int* p1=&i;//指向常量的指针
2.int* const p2=&i;//常量指针
对于指针类型的常量的解读,可以从变量开始,由内到外。(1)中,const修饰的是int* p1,也就是说,p1是一个指向整型的指针,同时p1所指向的对象的值是不能通过p1来改变的,但是可以改变p1指向的对象,因此说p1是指向常量的指针。例如:
(1)*p1=5;//错误,不能通过指针修改对象
(2)p1=&j;//正确,p1指向的对象可以改变
对于(2),可以看到const是直接修饰指针p2的,也就是说,p2的值是常量,但是可以通过p2修改对象的值,所以称为常量指针,例如:
(1)*p2=5;//正确,可以通过p2修改对象的值
(2)p2=&j;//错误,p2不能修改
另外需要注意的是,所谓的不能通过p来修改对象,或者p不能修改,仅是对于p来说。对象i的值还是可以通过其他渠道进行修改的。
引入两个概念:顶层const和底层const。可以简单的认为,声明或者定义的对象(指针也是对象),如果对象本身是const的,那么就是顶层const,否则是底层const。从概念上并不容易搞清除,看几个例子:
(1)const int i=1;//i本身是const,顶层
(2)const int* p=&i;//p本身不是常量,底层
(3)int* const p=&i;//p本身是常量,顶层
(4)const int* const p=&i;//左边是底层,右边是顶层
对于常量引用,同样有两种:
(1)const int& a=i;//正确,i不需要是常量
(2)int& const b=i;//同样正确,不过意思不同
对于(1),和指针一样,不能通过a修改i的值,不过对于(2),其实等价于int& b=i。原因在于,顶层const被忽略掉了。
对于函数的参数类型,例如:
int foo(const int& t);
int foo(int& t);//错误,重复声明
按照函数重载的规则,以上两者只能存在一个,建议采用const版本。一部分原因,在于变量在传输的时候,会忽略顶层const的属性,而非常量可以转换为常量。另外,这样定义的适用性更强。
还有一种情况,就是类成员函数的const,例如:
struct base
{
int num;
int getNum() const{return num;}//若没有const,那么对于const base将无法使用该函数
};
这样的const,作用是把类对象的this指针转换为常量。在不需要修改对象成员的时候,可以保证成员不被修改,另外,与上一种相同,当对象为常量对象时,只有这样才能正确返回。
另外,const可能还有许多应用,这里先说这些,遇到再补充。另外,C++11 新加入了constexpr,下篇文章将会介绍。
最新文章
- STL UVA 11995 I Can Guess the Data Structure!
- [Zend]设置ZendStudio编辑器配色
- JNA使用
- 连接Access数据库查询语句
- 趣味Python入门(一):初识Python
- 对mysql经常使用语句的详细总结
- HW6.21
- 文件上传(FileUpload控件)
- Binary Tree Paths 解答
- hdu_2111_Saving HDU(贪心)
- ajax删除数据(不跳转页面)
- 一天浓缩学习webpack经过
- css超出内容以省略号显示
- Python 好用得让人发指的函数参数语法糖
- java程序高CPU,如何直接定位(linux系统下命令行操作)
- 实时监听input输入内容的N种方法
- 关于Vue数组操作
- Json.net 反序列化 部分对象
- UI领域中常常听见的''modal''到底是什么?
- pyDay16
热门文章
- SQL-Redis使用详细教程
- LeetCode(62)Unique Paths
- Windows和Linux启动虚拟环境
- bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)
- eclipse安装Aptana 插件,并设置使之能提示css,js,html,帮助编写代码
- 【BZOJ3925】地震后的幻想乡(期望概率DP,状压DP)
- 3.2 符号表之二叉查找树BST
- 【Eclipse+IntelliJ反编译】Eclipse/IntelliJ IDEA反编译查看源码及注释
- Linux下汇编语言学习笔记33 ---
- 得到java异常printStackTrace的详细信息