C++中const限定符

一 、const限定符

有时候我们需要定义一种变量,它的值不能改变。例如:用一个变量表示缓冲区。为了满足这一要求,可以使用const限定符。const对象一旦创建后该值不可以改变,所以const对象必须初始化,可以是任意的复杂表达式。

	const int buffsize = 512;//缓冲区大小

对于非const类型可以参与的操作相比,const类型可以完成大部分,限制就是在该类型的对象上的操作不能改变其内容。

如果利用一个对象去初始化另外一个对象,则它们是不是const类型都无关紧要,因为拷贝完成后,新对象和旧对象没有什么关系了。

	int size = 512;
	const int buffsize = size;//size值被拷贝

默认状态下,const对象仅在文件内有效。当以编译时初始化方式定义一个const对象时,编译器会找到代码中用到该对象的地方,用值替换。

如果程序中包含多个文件,则每个用到const对象的文件都必须访问到它的初始值才可以。为了支持这一做法,默认情况下,const对象被设置为该文件内有效,如果多个文件出现了同名的const定义,其实等同于在不同文件内分别定义了独立变量。

某些时候我们需要变量在文件内共享,不希望有独立变量,则可以在声明或者定义时添加extern关键字,只用定义一次即可。

test.h 声明
extern  const int size;
file.1cpp 定义
extern  const int size=100;

二 、const的引用

可以把引用绑定到const对象上,就像绑定到其他对象一样,称之为对常量的引用。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。

	const int ci = 1024;
	const int& r = ci;  正确 引用及对象都是常量
	int r1 = 42;
	int& r2 = ci;  错误 非常量引用指向一个常量

引用类型必须于其所引用的对象的类型一样。但是有两个例外,第一种就是在初始化常量引用时允许使用任意表达式只要可以转化为所引用的类型即可。允许为一个常量引用绑定非常量的对象,字面值。

	int i = 42;
	const int& r1 = i; 正确
	const int& r2 = 42; 正确
	const int& r3 = 2 * r2; 正确
	int& r4 = r1 * 2;错误 r4是一个普通的非常量引用

那么这种情况出现的原因是什么呢?需要明白当一个常量引用被绑定到另外一种类型上是的情况。

double test=3.14;
const int  &r1=test;

r1引用了一个int类型的数,对r1的操作是整数运算,但test是double类型,因此编译器把上述代码变成了这样:

const int temp=test;
const int &r1=temp;

在这种情况下r1被绑定了一个临时量对象。所谓临时量对象就是当编译器需要空间来暂存表达式的求值结果时临时创建的一个未命名对象。

常量引用仅仅对操作做出了限定,对于引用本身是不是常量未作限定。

	int i = 42;
	int& r1 = i;
	const int& r2 = i;
	r1 = 0;
	r2 = 0; 错误 r2是常量引用

r2绑定非常量整数i是合法行为,然而不允许通过r2修改i的值。尽管如此,i的值也可以通过其他方式修改。

三、指针和const

与引用一样,也可以令指针指向常量或者非常量。指向常量的指针不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。

	const double pi = 3.14;
	double* ptr1 = π 错误,ptr1是一个普通指针
	const double* ptr2 = π
	*ptr2 = 0; 不能给ptr2赋值

指针的类型必须于其所指对象的类型一致。例外情况就是令一个指向常量的指针指向非常量对象。和常量引用一样,仅仅要求不能通过该指针改变对象的值,没有规定那个对象的值不能通过其他方式改变。

指针是对象而引用不是,因此允许把指针本身定为常量。常量指针必须初始化。而且一旦初始化则指针的值(即存放在指针中的地址)就不能再改变了。

	int num = 5;
	int* const ptr1 = # 永远指向num

搞清楚声明最有效的办法就是从右往左读。此例中离ptr1最近的是const,代表常量对象,下一个为*,代表常量指针,最后为int,代表指向的是一个int类型。

四、顶层const

如前所述,指针本身是不是常量和指针所指的是不是一个常量是两个相互独立的问题。用顶层const表示指针本身是个常量,用底层const表示指针所指的对象是一个常量。

当执行拷贝操作时,顶层const基本不受什么影响。但底层const的限制不容忽视,当执行对象的拷贝操作时,拷入和拷出的对象必须有相同的底层const资格,或者两个对象的数据类型可以转换。

	int i = 0;
	int* const p1 = &i;//顶层const
	const int ci = 42;//顶层const
	const int* p2 = &ci;//可以改变p2的值,底层const
	int* p = p2;  错误 p2包含底层const的定义
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值