C++const限定符

添加const限定的对象不能改变其内容,且必须初始化。

const对象仅在文件内有效

默认状态下,const对象仅在文件内有效。当以编译初始化的方式定义一个const对象时,编译器在编译过程中将用到该变量的地方均替换为其对应的值。默认情况下,const对象被设定为仅在文件内有效。当多个文件中出现了同名const变量时,等同于在不同文件中分别定义了独立的变量。若要在文件间共享,则必须对const变量不管在声明还是定义都加上extern关键字,这样仅需定义一次即可。

//.cpp文件中定义并初始化了一个常量,可以被其他文件访问
extern const int buffSize = 555;
//.h文件中,与.cpp文件中是同一个,指明并非文件所独有
extern const int buffSize;

const与引用

把引用绑定到const变量上就像绑定到其他变量上一样,被称为对常量的引用。对常量的引用不能被用作修改其绑定的对象。

const int c = 1024;
const int &r = c;   //正确,引用与对象类型相同
int &r1 = c;        //错误,试图让一个非常量引用指向一个常量对象

引用类型必须与其所引用对象类型一致,但是有两个例外。第一种例外为,初始化常量引用时,允许用任意表达式作为初始值,只要改表达式结果可以转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值甚至一般表达式:

int i = 42;
const int &r1  = i;     //正确,允许将一个const int绑定到一个普通int上
const int &r2 = 42;     //正确,r1是一个常量引用
const int &r3 = r1 * 2; //正确,r3为一个常量引用
int &r4 = r1 * 2;       //错误,r4为一个普通的非常量引用

原理如下:

double dval = 3.14;
const int &r = dval;

为了让r绑定一个整数,编译器将上述代码变成如下形式:

const int temp = dval;  //生成一个临时的整型常量
const int &r = temp;    //让r绑定临时量

r绑定了一个临时对象,即编译器暂存表达式的求值结果是临时创建的一个未命名的对象,常称为临时量。对临时量的赋值行为被视为非法。
常量引用仅对引用可参与的操作做出了限定,对于引用本身是不是一个常量并没有限定,所以可以通过其他途径修改被引用对象。

const与指针

对于C指针文章中的const与指针于此有如下补充:
指向常量的指针不能改变其所指对象的值,要想存放常量对象的地址,则必须用指向常量的指针。

const double pi = 3.14;
double *p1 = π           //错误,p1是一个普通指针
const double *p2 = π     //正确
double d = 1.12;
p2 = &d;                    //正确

常量指针意为,指针本身为常量,即:

int a = 0;
int const * p = &a;

常量指针必须初始化,而且一旦初始化完成,则它的值(即存放在指针中的那个地址)就不能再改变。指针是一个常量并不意味着不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的类型。
允许一个指向常量的指针指向一个非常量对象,其详细说明见C指针const与指针章节。

顶层const

顶层const表示指针本身是一个常量,而底层const表示指针所指对象是一个常量,详细说明参考上节与C指针文章中const与指针。一般来说,非常量可以转换成常量,反之则不行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值