C++回顾——常量

一、值替代
要使用const而非#define,必须把const定义放进头文件里。这样,通过包含头文件,可把const定义单独放在一个地方并把它分配给一个编译单元。C++中的const默认为内部连接(C中默认是外部连接),也就是说,const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到。当定义一个const时,必须赋一个值给它,除非用extern作出了清除的说明。
通常C++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里。但是,extern强制进行了存储空间分配,另外,如取一个const的地址,也要进行存储空间分配。
想绝对不为任何const分配存储是不可能的,所以const的定义必须默认为内部连接。在大部分场合使用内部数据类型的情况,包括常量表达式,编译器都能执行常量折叠(在编译阶段,对该变量进行值替换,同时,该常量拥有自己的存储空间,并非像宏定义一样不分配存储空间)。

const的作用不仅局限于在常数表达式里代替#define,如果用运行期间产生的值初始化一个变量且知道在变量生命期内是不变的,则用const限定该变量,如果试图改变它,编译器会报错。这样做,也消除了读存储器和读内存操作,使编译器产生的代码更有效。

const可以用于集合(必须分配内存),在这种情况下,const意味着“不能改变的一块存储空间”。

二、const修饰指针
当使用带有指针的const时,有两种选择:1)const修饰指针正指向的对象;2)const修饰在指针里存储的地址。
1、指向const的指针
const修饰“最靠近”它的那个(在标识符的开始处读它并从里向外读)。
const int * u; // u是一个指针,它指向一个const int
u可以指向任何标识符,但它所指的值是不能被改变的。
int const * u; // u是一个指向const的int的普通指针
这里,const又把它自己与int结合在一起,效果与前面定义一样。为使程序更具有可读性,应坚持用第一种形式。

2、const指针
使指针本身成为一个const指针,必须把const标明的部分放在*的右边。
int i = 8;
int * const w = &i;
w是一个指针,这个指针是指向int的const指针。所以编译器要求给它一个初始值,这个值在指针生命期内不变,然而可以改变它所指向的值。

可以使用下面两种形式中的任何一种把一个const指针指向一个const对象:
int i = 8;
const int * const x = &i;
int const * const x2 = &i;

C++关于类型检查是非常严格的。可以把一个非const对象的地址赋给一个const指针,但是不能把一个const对象的地址赋给一个非const指针。

字符数组的字面值:常量字符数组。

三、const修饰函数参数和返回值
1、传递const值
如果函数参数是按值传递,则可用const修饰

2、返回const值
如果一个函数按值返回一个类对象为const时,那么这个函数的返回值不能是一个左值(即它不能被赋值,也不能被修改)。编译器创建的临时变量自动成为const。

四、const修饰类
在一个类里建立一个普通的(非static)const时,不能给它初始化,这个初始化工作必须在构造函数里进行。
类里面建立一个static const,必须在定义的地方对它进行初始化。因此,它可以看做一个编译期间的常量(不管类的对象被创建多少次,这个常量成员都只有一个实例)

如果声明一个成员函数为const(把修饰符const放在函数参数表的后面,而且必须以同样的方式重复出现在定义里),则等于告诉编译器该成员可以为一个const对象所调用。一个没有被明确声明为const的成员函数被看成是将要修改对象中数据成员的函数,而且编译器不允许它为一个const对象所调用。不修改数据成员的任何函数都应该把它们声明为const,这样它可以和const对象一起使用。

按位const:对象中的每个字节都是固定的,所以对象的每个位映像从不改变(当编译器被告知一个对象是const对象时,它将绝对保护这个对象按位的常量性)。
按逻辑const:虽然整个对象从概念上讲是不变的,但是可以以成员为单位改变。在类声明里使用关键字mutable,以指定一个特定的数据成员可以在一个const对象里被改变。

具有只读存储能力的const对象,有以下要求:
1)没有用户定义的构造函数或析构函数
2)不能有基类,也不能包含有用户定义构造函数和析构函数的成员对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值