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,下篇文章将会介绍。
C++中的常量(一) const限定符的更多相关文章
- C++const限定符
在C语言中我们使用#define宏定义的方式来处理符号常量.而在C++中有一种更好的处理符号常量的方法,那就是使用const关键字来修改变量声明和初始化.这种处理常量方式的好处不言而喻:如果程序在多处 ...
- const 限定符
1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...
- C++杂谈(一)const限定符与const指针
const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...
- C++ Primer 第二章 引用 指针 const限定符
1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...
- C++ const 限定符
C++ const 限定符 作用:把一个对象转换成一个常量 用法:const type name = value; 性质:1. 定义时必须初始化,定义后不能被修改.2. 类中的const成员变量必须通 ...
- const限定符的作用
const限定符的作用: 1.定义const常量:const可以将一个对象变成一个常量,不可被修改,所以定义的 时候必须进行初始 ...
- C++之const限定符
作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...
- 变量和基本类型——复合类型,const限定符,处理类型
一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...
- C++之const限定符(顶层const,底层const)
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...
随机推荐
- Oracle 实现查询不区分大小写(SQL实现)
转为小写 LOWER('ABC') 结果 abc转为大写 UPPER('aBc') 结果 ABC 将数据库字段数据和前台接受的值全部转换为大写或者小写 例: select * from table ...
- 第二周习题F
Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multiplications: x2 ...
- 竞赛Noi_Linux使用总结(vim)
刚换完Linux,趁着教练给的改题时间(T2确实猛)自己上网找了好多博客,发现很多跟竞赛有关的内容是碎片化的,从最基本的如何用vim写代码.编译.运行,再到怎么改设置使打代码时手感强一些,最后学对拍, ...
- SSM java.lang.NullPointerException
如上图所示的异常 原来是少了这个东西,加上就好了
- Python条件判断(if)
Python条件判断(if) 一.基本介绍 1.Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句…… 需要注意的是,Python没有像其他大多数语言一样使用 ...
- 九度oj 题目1063:整数和
题目1063:整数和 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4043 解决:2638 题目描述: 编写程序,读入一个整数N.若N为非负数,则计算N到2N之间的整数和:若N为一个负数 ...
- * SPOJ PGCD Primes in GCD Table (需要自己推线性筛函数,好题)
题目大意: 给定n,m,求有多少组(a,b) 0<a<=n , 0<b<=m , 使得gcd(a,b)= p , p是一个素数 这里本来利用枚举一个个素数,然后利用莫比乌斯反演 ...
- 关于struct函数以及重载
1,关于其函数的应用 我们从这里可以看出,void,int,Node,这三种类型,都是可以定义的. 2,重载的方式 如何重载比较符号 这里的比较重载就是小于号,如果前者x比后者x小就返回真 否则返回假 ...
- Ubuntu12.04之vi的问题
版本:ubuntu12.04. 问题:vi不能正常使用方向键与退格键. 原因:ubuntu系统自带的 vi 不完整导致. 解决方法:安装完整的vi,sudo apt-get install vim-g ...
- Ubuntu 16.04添加多张虚拟网卡
1.添加 sudo ifconfig enp0s31f6:0 192.168.10.10 up 2.卸载 sudo ifconfig enp0s31f6:0 down 注意:enp0s31f6每台电脑 ...