C++ const引用浅析
作者:网络转载 发布时间:[ 2012/8/15 14:35:55 ] 推荐标签:
顾名思义,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,类似,没有中间变量进行类型转换
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11