再探C++Primer (5)const限定符

本文详细解析了C++中const修饰符的使用方法及其特性,包括const常量的定义与使用、const引用的绑定规则、指向常量的指针与常量指针的区别以及顶层const与底层const的概念。

###const常量#

我们通过const修饰变量来定义常量,const对象一旦创建完成就不允许修改,const对象必须初始化。

const int a = 100;		//正确
a = 10;					//错误,const对象不允许修改
const int b;			//错误,const对象必须初始化

默认情况下,const对象只在文件内有效,如果需要在其他文件中使用该对象,则需在定义和声明处均添加extern关键字,这点和变量不同。

//file1.h文件定义了常量a;
extern const int a=100;
//file1.cpp文件声明了常量a,与file1.h中的是同一个;
#include "file1.h"
extern const int a;

###const的引用#

把引用绑定到const对象上,称为对常量的引用。

const int a = 100;
const int &b = a;

允许把对const的引用绑定到非常量上,但不允许通过对const的引用来修改非常量的值。

int a = 100;
const int &b = a;		//正确,允许把对const的引用绑定到非常量上
b = 10;					//错误,不允许通过对const的引用修改非常量的值

不允许把普通引用绑定到const对象上,因为试图通过引用修改const对象。

const int a = 100;
int &b = a;				//错误,不允许把普通引用绑定到const对象上

严格上来讲,不存在常量引用,因为引用本身不是一个对象,但是程序员常常将对const的引用称为常量引用。

###指向常量的指针和常量指针#

指向常量的指针:

同引用一样,指向常量的指针不允许修改所指对象的值,想要存放常量对象地址,只能使用指向常量的指针。

const int a = 100;
int *b = &a;			//错误,b是一个普通指针
const int *c = &a;		//正确,c是一个指向常量的指针
*c = 10;				//错误,不能通过c来修改常量a

同绑定const的引用一样,指向常量的指针可以指向非常量对象,指向常量仅代表不允许通过该指针修改对象的值,但没有规定所指对象必须为常量。

指向常量的指针还可以更改所指对象,但不允许修改所指对象的值。

const int a = 100;
int b = 10;
const int *c = &a;
c = &b;					//正确,允许修改所指对象,允许指向非常量对象

常量指针:

指针是对象,所以允许把指针本身定义为常量,常量指针不允许修改指针的值,但是允许通过指针修改所指对象的值。

int a = 100;
int *const b = &a;
*b = 10;				//正确,允许通过常量指修改所指对象的值
int c = 10;
b = &c;					//错误,不允许修改指针本身的值

顶层const:

我们用顶层const来表示对象本身是常量,底层const则与指针引用等复合类型的基本类型部分有关。

同其他类型相比,指针类型既可以是顶层const,也可以是底层const。

int a = 100;
int *const b = &a;		//不能修改b的值,b是一个顶层const
const int d = 10;
const int *c = &d;		
c = &a;					//可以修改c的值,c是一个底层const

转载于:https://my.oschina.net/gjy19940115/blog/708712

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值