|
今天给大家分享一下这段时间学习c++的总结学习:c++里面的const关键字和引用。 一、const关键字的总结 1、const什么时候为只读变量,什么时候又是常量呢? (1)const常量的判别规则:
(2)const引用的类型与初始化变量的类型
代码版本一: #include <stdio.h>/ s3 c& Y7 ^) q& C& h6 o int main()# t0 Q3 M/ W2 }. k$ ^ {/ U9 c- @0 E0 o: H, _, y2 y const int x = 1;//直接得到值,进入符号表,但是还是会为 x 分配空间,只不过这个空间 x 没有用而已 const int& rx = x;//rx代表只读变量,这个变量是编译器为x分配而没有使用的空间;引用代表变量的别名,而变量代表一段内存空间的别名,所以引用代表一段内存空间的别名 * T2 O& y1 s1 z$ K* I int& nrx = const_cast<int&>(rx); //消除 rx只读属性,和rx 代表的内存空间相同,同时c++里面的几种类型转换要掌握 nrx=5; printf("x = %d\n",x); printf("rx = %d\n",rx); printf("nrx = %d\n",nrx); # v) Y# ]+ [0 ~; @: x6 n printf("&x = %p\n",&x);4 y# u' m2 z# E% N5 Y printf("&rx = %p\n",&rx);5 B( P3 E* R0 b, m3 S& q" ]$ k! w/ e N printf("&nrx = %p\n",&nrx);: Q' n+ _) P0 q0 [' P: u `' Q ( `) ?3 s) Q' }" M c/ c3 | return 0; }! i& i6 N {5 [* J9 M+ Y 输出结果: root@txp-virtual-machine:/home/txp# ./a.outx = 1- P6 h, M" z9 Z) ?+ ~ rx = 5$ I' J) v* N; @3 F nrx = 5 &x = 0x7ffcc5fa8abc! g( X9 T& D: E) B/ J &rx = 0x7ffcc5fa8abc &nrx = 0x7ffcc5fa8abc) j( S7 t3 f4 H" O 代码版本二: #include <stdio.h>int main() t- G8 c4 G) s8 F( j$ n {% g; _- \ Q) d' C( ~& g volatile const int y = 2;// 只读变量,不会进入符号表 int *p = const_cast<int*>(&y);//y被 const修饰,取到的地址也有 const 属性,这里将地址只读属性去掉 ; y$ o/ L3 M$ Y *p = 8;; [: K W5 t: r3 V 0 {5 B9 A4 c) q% G8 ?! ?/ B* S8 f3 e W printf("y = %d\n",y); printf("p = %p\n",p);/ S% ^. d: Z% a% S- Z0 m# O 0 k* G% R! W- }( ?2 h) m* q return 0; }: t' O) f5 u" t& o* z6 \6 `, |3 S$ l( y 输出结果: root@txp-virtual-machine:/home/txp# ./a.out+ e! z x3 Q Ly = 8& S) \" A Q# s# h# s1 Z p = 0x7ffd785596846 D) M6 B* W; r) e" a% d. i ! V( N) R, h& B2 V8 K' }' `, E 代码版本三: #include <stdio.h>int main() { volatile const int y = 2; int *p = const_cast<int*>(&y); *p = 8;, }+ q1 g% |# Z% J- l' d printf("y = %d\n",y);8 F7 B. X1 Z: i' l5 U% L# i' Y printf("p = %p\n",p); const int z = y ;//只读变量 ( {3 U+ U f; X! b3 z3 p8 [* V p = const_cast<int*>(&z);5 i' e, r2 r- f( _% e7 K : K3 D& u Z3 X' W) W% D *p= 9; F6 a- R9 E3 z+ L2 J3 D printf("z = %d\n",z);* q: j. Z" E( p. I printf("p = %p\n",p); , ]& k9 t4 T$ z$ a% B return 0;0 b' l- [: n9 V. o" P+ j" k! f# w }8 z' x+ [% S6 p - c& S( b) `: Y4 U- G1 X/ n 输出结果: root@txp-virtual-machine:/home/txp# ./a.out. N% l- x* O- e# Wy = 8 p = 0x7ffc5d651250 z = 9 p = 0x7ffc5d6512547 Q' r( |- g3 m! b) w* Q " A! b. p" p$ l8 ^ r 代码版本四: #include <stdio.h>: \: G1 C4 J& g) v- H- B( {. ?int main() { char c = 'c'; char& rc = c; const int& trc = c; // char 类型默认转换为 int;const 引用初始化类型不同,将得到新的只读变量,所以改变 rc 和 trc 没有丝毫关系,从我们的输出结果可以看出来 " x9 N! X- | v5 U rc = 'a';+ _9 [# a- q7 M g$ M " ^, K8 Z# d" W" A- P8 F% c printf("c = %c\n",c);5 s( ^" \7 j2 e. _5 D printf("rc = %c\n",rc); printf("trc = %c\n",trc); return 0;: X, _' y/ ^. c, k7 s9 ? 7 i% O4 \/ Y6 A" l+ Q }1 K/ B3 V) y1 B1 N2 q 结果输出: root@txp-virtual-machine:/home/txp# ./a.out9 P# Y$ h) J6 P, }; F6 O# nc = a5 u# g6 O5 f' k rc = a# W; x2 l0 e% L) d trc = c$ J6 N1 v; N" s% }7 ?7 U 二、引用的总结: 1、引用与指针有什么关系,以及如何理解"引用的本质就是指针常量"? (1)指针是一个常量:
(2)引用只是一个变量的新名字:
(3)从使用c++语言的角度来看:
(4)从c++编译器的角度来看:
(5)在工程项目开发中:
代码实践: 版本一: #include <stdio.h>8 b* ?9 v4 }# ` int a = 2;2 H6 \! l; N3 {! N& y struct SV{' i6 W2 j g" N# p int& x; int& y; int& z; }; int main(): h6 a4 [0 d5 H! V: A& b/ y { int b =4;* k2 A! o: H3 G! g" H int* pc = new int(3) ; SV sv = {a,b,*pc};2 q! _! h* _+ {+ N2 A0 [ 2 {1 c, n9 p, ~% A9 W+ I printf("&sv.x = %p\n",&sv.x); printf("&sv.y = %p\n",&sv.y); printf("&sv.z = %p\n",&sv.z);6 Q& V7 u( U; K# g 5 I5 n/ t% X3 [1 e) Q$ r delete pc;* F4 @5 G+ b/ a' j1 ^ return 0;/ Q$ R! S% Q: j5 y }/ P8 F u( h! V& y 输出结果: root@txp-virtual-machine:/home/txp# ./a.out&sv.x = 0x601050 &sv.y = 0x7ffee11ba794 &sv.z = 0x1cfd010/ y( |+ l. l ~+ I * E I& x- R1 I% R 版本二: #include <stdio.h>! ~; G: {, K/ G* _5 pint a = 2;. E4 a. } [0 O+ V8 F ; ?4 {6 c j" Z: W* q/ R struct SV{ int& x; int& y; int& z;" Z; n4 K4 G6 e }; int main(); q: {7 @9 H! Y* K2 C' ^ { ?; M4 J8 U* P2 L1 Z int b =4; int* pc = new int(3) ; SV sv = {a,b,*pc}; int& array[] = {a,b,*pc};//数组中的每个元素是引用就不可以;error: declaration of ‘array’ as array of references;C++ 天生要支持 C 语言,C 语言中数组中的每个元素在内存中是顺序存放的,地址是递增的,所以在 C++ 中也要兼容这个特性,而在 C++ 中唯有引用数组破快了这个特性,所以说 C++ 中不支持引用数组;&array[1] - &array[0] != Expected ==> 4" u1 K8 a* F! v6 T ' w: m/ k. j3 \% f; T printf("&sv.x = %p\n",&sv.x);: m! R0 j8 D" U' c+ Z Z printf("&sv.y = %p\n",&sv.y); printf("&sv.z = %p\n",&sv.z);# M$ Q, u% d, q' q% C) @0 S& t. C % [4 X5 u* }, Y, S8 K- B delete pc; ' k, O! v: D3 M% d, a# h% } return 0; }' ]( ^' Q( g$ A: W* h 输出结果: root@txp-virtual-machine:/home/txp# g++ test.cpptest.cpp: In function ‘int main()’:" W2 u+ ~# Z/ ^/ O. r4 h& z test.cpp:16:14: error: declaration of ‘array’ as array of references int& array[] = {a,b,*pc}; . p: B) b: l2 b, }4 `/ \ 三、总结:
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 ! l# S1 R+ N- c- @ |
微信公众号
手机版