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 ...
随机推荐
- Error: Divergence detected in AMG solver: k
** Error: Divergence detected in AMG solver: k A:Since you were working on convergence issue from pa ...
- poj3440--Coin Toss(几何上的概率)
Coin Toss Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3946 Accepted: 1076 Descrip ...
- 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
IntelliJ IDEA是一款非常优秀的JAVA编辑器,初学都可会对其中的一些做法感到很别扭,刚开始用的时候我也感到很不习惯,在参考了网上一些文章后在这里把我的一些经验写出来,希望初学者能快速适应它 ...
- Ajax核心知识(2)
对于Ajax核心的东西需要在进行总结提炼一下: xmlHttp对象. 方法:xml.responseText获取后台传递到前台的数据,经常性的使用var object=xml.responseText ...
- A Simple Problem with Integers-POJ3468
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- P1614 爱与愁的心痛
洛谷——P1614 爱与愁的心痛 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第一章 <我为歌狂>当中伍思凯神曲<舞月 ...
- hadoop(2)hadoop配置
hadoop入门(二) hadoop的配置 1.本地模式 2.伪分布式 3.分布式 一.配置linux环境: 1打开虚拟网络编辑器,选择 VMnet1 仅主机模式, 子网 IP 设为 192. ...
- CTO是有门槛的 我眼中真正优秀CTO应具备五大素质
最近几个月,不断有人找我推荐CTO人选,这两年互联网创业和创投实在是太火爆了,全民创业,创业项目井喷,一下子发现CTO不够用了,全行业缺CTO,到处都在找CTO.说实话,我自己也没有CTO存货,CTO ...
- C++之类的比較运算符的重载
比較运算符的重载通常有两种方式: 第一:作为成员函数重载 曾经几章的Student类为例: <span style="font-family:Microsoft YaHei;font- ...
- 条款三:尽量用new和delete而不用malloc和free
malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数. 假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new: s ...