[C/C++]: C++ const引用浅析

顾名思义,const修饰的意思就是不能直接改变的值。

在C++的编码过程当中很多地方可以用到。

1.许多对象初始化之后,其值不用再改变

2.符号常量,使代码可以更加容易维护

3.某些指针只是获取所指的对象的值,而不能改变其所指对象的值

4.防止函数调用过程当中对所传递参数的修改


用const修饰的对象,有以下需要牢记的特性:

1.定义的时候必须初始化,后续不能再改变其值

2.如果一个const用另一个constant表达式初始化,则在编译的时候对其求值,同时不会分配存储空间,

也就是不能作为左值(其地址可以获取的某个对象)进行使用


对于引用,指的是对象的一个别名。引用在定义的时候必须初始化,绑定到一个对象当中。

主要用在函数参数和函数返回类型当中。当const和引用结合起来使用的时候,要注意一些特性的区分,

下面通过例子进行简单说明。

// 注意区分指针和隐用
int val = 2012;
int& valr = val; // ok
int& valr1 = &val; // error
int* p = &val;
int*& valr2 = &p; // ok,valr2是int*类型的引用

// 注意区分一般引用和常引用,const T&和T&
int val = 2012;
int& valr = val; // ok
const int& valr1 = val; // ok
int& valr = 2012; // error,一般引用T&的初始化表达式必须是左值,2012不是左值,所以不行
const int& valr1 = 2012; // ok,这里通过int temp = int(2012);构建一个temp,然后再通过temp初始化const int&,这个temp一直存在,直到程序块结束

// 常引用的另一个例子
int val = 2012;
int& valr = val+1; // error,同样val+1不是一个左值,所以不能用来初始化int&
const int& valr1 = val+1; // ok,也是通过中间的临时变量处理
// 常引用结合指针的使用
int val = 2012;
int*& valr = &val; // error,因为&val不是一个左值,&val获取的是一个地址,不能进行&val++之类的操作
int* const& valr = &val; // ok,const T&就没有上面这种限制了,&val构建中间变量,然后再初始化,注意const不能放在*之前,否则就是修饰指针所指的对象了

const int var = 2012;
int*& varr = &var; // error,显然的
int* const& varr = &var; // error,因为var是const int类型的
const int* const& varr = &var; // ok,满足要求

// 对于不是const&
const int* p = &var;
const int*& varr = p; // ok,此时不需要const&,因为p是左值
// 用一个const初始化另一个const&
// 前面提到某些const变量会在编译的时候求值,不会分配存储空间,所以不能当作左值来处理
const int val = 2012; // val不分配存储空间
int& valr = val; // error,val不能做左值
const int& valr = val; // ok,也是通过中间变量处理

// 对于指针的结合使用
const int val = 2012;
const int* p = &val;
const int* &pr = p; // ok,p是左值
const int* const& pr1 = &val; // ok,通过中间变量初始化
int* const& pr2 = &val; // error,引用的类型不符合,一个是const int*,另一个是int*

// const&初始化的类型转换
int val = 2012;
const double& valr = val;
double dval = 3.14159;
const int& valr = dval; // ok,temp构建的时候,类型转换int temp = int(dval);
const int& valr1 = 3.14159; // ok,temp构建的时候,类型转换int temp = int(3.14159);
int& valr2 = dval; // error,没有temp进行中间的类型转换
int& valr3 = 3.14159; // error,类似,没有中间变量进行类型转换
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值