C++ const引用浅析

上一篇 / 下一篇  2012-08-16 13:19:36 / 个人分类:C++

.`o/S*N;r6a!ZQ W,F.X0  顾名思义,const修饰的意思就是不能直接改变的值。

^N_!r!Y1c'^4?0 51Testing软件测试网RUz&}:NRs

  在C++的编码过程当中很多地方可以用到。51Testing软件测试网P"U(]t`%gBS

51Testing软件测试网?2|.Nk b

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

!h O$m1^)Dv:]V"p0 51Testing软件测试网Z M7DgV1@

  2、符号常量,使代码可以更加容易维护51Testing软件测试网Nn.Ljo5\

@@ d.oV0Wy0  3、某些指针只是获取所指的对象的值,而不能改变其所指对象的值51Testing软件测试网OXI'o0~RM+c(`"V4b

4MsRl3quQ,E0  4、防止函数调用过程当中对所传递参数的修改

+q"pMvA0 51Testing软件测试网jj0iP h E Dm%a9t

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

6c1`(d+{9l9N0

Fj"`,` W0  1、定义的时候必须初始化,后续不能再改变其值

+U4g,|9in K0

)|9oyUdxP$f}0  2、如果一个const用另一个constant表达式初始化,则在编译的时候对其求值,同时不会分配存储空间,51Testing软件测试网 q3xr cN

A!Bfv.Gxv0  也就是不能作为左值(其地址可以获取的某个对象)进行使用51Testing软件测试网]["W GexD6um

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

wUe1B5| W,s-z0

+QX%TO_3y0  主要用在函数参数和函数返回类型当中。当const和引用结合起来使用的时候,要注意一些特性的区分,51Testing软件测试网H,ut6KNG

SJ+]9@9V^!eVo9G(B U0  下面通过例子进行简单说明。

)b`1{4XC0

8PB-Q _P"z(P0

/Fi`vrE6P gi0
// 注意区分指针和隐用51Testing软件测试网*wkLZf*{@
int val = 2012;51Testing软件测试网puh+hB;Y
int& valr = val; // ok
-U2F"@ e"xt s+H-Ow0int& valr1 = &val; // error51Testing软件测试网.UQ8OKR}3z7l
int* p = &val;
SJ(MMX*\T0int*& valr2 = &p; // ok,valr2是int*类型的引用

x9~sN'n1lI\0 51Testing软件测试网3Y[%X~5z _|

// 注意区分一般引用和常引用,const T&和T&
xtc;\6`5~:C0int val = 2012;
2g0z(CEn0f9_lAN0int& valr = val; // ok
q.Oy|/k8e9z0const int& valr1 = val; // ok
5G u7bnS0int& valr = 2012; // error,一般引用T&的初始化表达式必须是左值,2012不是左值,所以不行
lnKa _$xiz2v-n0const int& valr1 = 2012; // ok,这里通过int temp = int(2012);构建一个temp,然后再通过temp初始化const int&,这个temp一直存在,直到程序块结束

WM6d#`%X;Z nA0 51Testing软件测试网Q"m m{;c_*C0s

&F7JNm{:ty~1p0// 常引用的另一个例子51Testing软件测试网 u6a svK!n2tw;F'lW
int val = 2012;
j m5xC L/d0int& valr = val+1; // error,同样val+1不是一个左值,所以不能用来初始化int&51Testing软件测试网Wz1Qx:l:]/{ [j9p
const int& valr1 = val+1; // ok,也是通过中间的临时变量处理
3?$a5I:c;K\`9E,Sa0// 常引用结合指针的使用
c^?j0v0int val = 2012;
,K\gS)RqA X0int*& valr = &val; // error,因为&val不是一个左值,&val获取的是一个地址,不能进行&val++之类的操作51Testing软件测试网\OjoIb
int* const& valr = &val; // ok,const T&就没有上面这种限制了,&val构建中间变量,然后再初始化,注意const不能放在*之前,否则就是修饰指针所指的对象了

8N\(EiXFWU6r1D0 51Testing软件测试网(C ad9F y%Jc[.p8TR

const int var = 2012;
ag2V6[E1~w4Z:\0int*& varr = &var; // error,显然的51Testing软件测试网8x%E-yR.F1Q pn]A
int* const& varr = &var; // error,因为var是const int类型的
#p5A)y,K#W5Dl {i0const int* const& varr = &var; // ok,满足要求
51Testing软件测试网c2z s1B1seW5l

51Testing软件测试网+{H_j`;as4L

// 对于不是const&
[-A Z Kz@0const int* p = &var;
c&q!@ i)t0V0Kh0const int*& varr = p; // ok,此时不需要const&,因为p是左值51Testing软件测试网7w+^3f1VE ] r r8H
// 用一个const初始化另一个const&
!dZT7KBc/k*aRy0// 前面提到某些const变量会在编译的时候求值,不会分配存储空间,所以不能当作左值来处理
-lHo%{ IB0const int val = 2012; // val不分配存储空间
{4}"MAF D0int& valr = val; // error,val不能做左值
/m2lL^#e2W;jv/J0const int& valr = val; // ok,也是通过中间变量处理
51Testing软件测试网R#hK(Zo-f)A'Xh"v4J

N_#O'{ C2c8@ d9u0// 对于指针的结合使用
!f'ss0mi-kvR7q\{R0const int val = 2012;
X? ^$\6x9jT0const int* p = &val;
:MQC,_C5E*Q0const int* &pr = p; // ok,p是左值
,ynq0cw%l0const int* const& pr1 = &val; // ok,通过中间变量初始化
H4h8di(\4__+E0int* const& pr2 = &val; // error,引用的类型不符合,一个是const int*,另一个是int*

cJ:L;HsD0 51Testing软件测试网:?/@X:|PA

// const&初始化的类型转换
#XEn7B"\^-SK0int val = 2012;
7H8J\*HV3{0const double& valr = val;51Testing软件测试网(Dr E:P-D v8D*E
double dval = 3.14159;51Testing软件测试网 ]hnou8jBA,x
const int& valr = dval; // ok,temp构建的时候,类型转换int temp = int(dval);
0mvR&^Ioir0const int& valr1 = 3.14159; // ok,temp构建的时候,类型转换int temp = int(3.14159);
F ^OtJjD+R#SP't0int& valr2 = dval; // error,没有temp进行中间的类型转换
"i7\*H(Z%s k0int& valr3 = 3.14159; // error,类似,没有中间变量进行类型转换
51Testing软件测试网[]K)O j


TAG:

 

评分:0

我来说两句

Open Toolbar