今天給大家分享一下這段時(shí)間學(xué)習(xí)c++的總結(jié)學(xué)習(xí):c++里面的const關(guān)鍵字和引用。
一、const關(guān)鍵字的總結(jié)
1、const什么時(shí)候?yàn)橹蛔x變量,什么時(shí)候又是常量呢?
(1)const常量的判別規(guī)則:
只用字面量初始化的const常量才會(huì)進(jìn)入符號(hào)表
使用其它變量初始化的const常量仍然是只讀變量
被volatile修飾的const常量不會(huì)進(jìn)入符號(hào)表
在編譯期間不能直接確定初始值的const標(biāo)識(shí)符,都被作為只讀變量處理
(2)const引用的類型與初始化變量的類型
相同:初始化變量成為只讀變量
不同:生成一個(gè)新的只讀變量
代碼版本一:
#include <stdio.h>
int main()
{
const int x = 1;//直接得到值,進(jìn)入符號(hào)表,但是還是會(huì)為 x 分配空間,只不過(guò)這個(gè)空間 x 沒(méi)有用而已
const int& rx = x;//rx代表只讀變量,這個(gè)變量是編譯器為x分配而沒(méi)有使用的空間;引用代表變量的別名,而變量代表一段內(nèi)存空間的別名,所以引用代表一段內(nèi)存空間的別名
int& nrx = const_cast<int&>(rx); //消除 rx只讀屬性,和rx 代表的內(nèi)存空間相同,同時(shí)c++里面的幾種類型轉(zhuǎn)換要掌握
nrx=5;
printf("x = %d",x);
printf("rx = %d",rx);
printf("nrx = %d",nrx);
printf("&x = %p",&x);
printf("&rx = %p",&rx);
printf("&nrx = %p",&nrx);
return 0;
}
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# ./a.out
x = 1
rx = 5
nrx = 5
&x = 0x7ffcc5fa8abc
&rx = 0x7ffcc5fa8abc
&nrx = 0x7ffcc5fa8abc
代碼版本二:
#include <stdio.h>
int main()
{
volatile const int y = 2;// 只讀變量,不會(huì)進(jìn)入符號(hào)表
int *p = const_cast<int*>(&y);//y被 const修飾,取到的地址也有 const 屬性,這里將地址只讀屬性去掉
*p = 8;
printf("y = %d",y);
printf("p = %p",p);
return 0;
}
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# ./a.out
y = 8
p = 0x7ffd78559684
代碼版本三:
#include <stdio.h>
int main()
{
volatile const int y = 2;
int *p = const_cast<int*>(&y);
*p = 8;
printf("y = %d",y);
printf("p = %p",p);
const int z = y ;//只讀變量
p = const_cast<int*>(&z);
*p= 9;
printf("z = %d",z);
printf("p = %p",p);
return 0;
}
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# ./a.out
y = 8
p = 0x7ffc5d651250
z = 9
p = 0x7ffc5d651254
代碼版本四:
#include <stdio.h>
int main()
{
char c = 'c';
char& rc = c;
const int& trc = c; // char 類型默認(rèn)轉(zhuǎn)換為 int;const 引用初始化類型不同,將得到新的只讀變量,所以改變 rc 和 trc 沒(méi)有絲毫關(guān)系,從我們的輸出結(jié)果可以看出來(lái)
rc = 'a';
printf("c = %c",c);
printf("rc = %c",rc);
printf("trc = %c",trc);
return 0;
}
結(jié)果輸出:
root@txp-virtual-machine:/home/txp# ./a.out
c = a
rc = a
trc = c
二、引用的總結(jié):
1、引用與指針有什么關(guān)系,以及如何理解"引用的本質(zhì)就是指針常量"?
(1)指針是一個(gè)常量:
值為一個(gè)內(nèi)存地址,不需要初始化,可以保存不同的地址
通過(guò)指針可以訪問(wèn)對(duì)應(yīng)內(nèi)存地址中的值
指針可以被const修飾成為常量或者只讀變量
(2)引用只是一個(gè)變量的新名字:
對(duì)引用的操作(賦值、取地址等)都會(huì)傳遞到代表的變量上
const引用使其代表的變量具有只讀屬性
引用必須在定義時(shí)初始化,之后無(wú)法代表其它變量
(3)從使用c++語(yǔ)言的角度來(lái)看:
引用與指針沒(méi)有任何的關(guān)系
引用是變量的新名字,操作引用就是操作對(duì)應(yīng)的變量
(4)從c++編譯器的角度來(lái)看:
為了支持新概念"引用"必須要一個(gè)有效的解決方案
在編譯器內(nèi)部,使用指針常量來(lái)實(shí)現(xiàn)"引用"
因此"引用"在定義時(shí)必須初始化
(5)在工程項(xiàng)目開(kāi)發(fā)中:
當(dāng)進(jìn)行c++編程時(shí),直接站在使用的角度來(lái)看待引用,與指針毫無(wú)關(guān)系,引用就是變量的別名
當(dāng)對(duì)C++代碼進(jìn)行調(diào)試分析時(shí),一些特殊情況,可以考慮站在C++編譯器的角度來(lái)看待引用
代碼實(shí)踐:
版本一:
#include <stdio.h>
int a = 2;
struct SV{
int& x;
int& y;
int& z;
};
int main()
{
int b =4;
int* pc = new int(3) ;
SV sv = {a,b,*pc};
printf("&sv.x = %p",&sv.x);
printf("&sv.y = %p",&sv.y);
printf("&sv.z = %p",&sv.z);
delete pc;
return 0;
}
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# ./a.out
&sv.x = 0x601050
&sv.y = 0x7ffee11ba794
&sv.z = 0x1cfd010
版本二:
#include <stdio.h>
int a = 2;
struct SV{
int& x;
int& y;
int& z;
};
int main()
{
int b =4;
int* pc = new int(3) ;
SV sv = {a,b,*pc};
int& array[] = {a,b,*pc};//數(shù)組中的每個(gè)元素是引用就不可以;error: declaration of ‘a(chǎn)rray’ as array of references;C++ 天生要支持 C 語(yǔ)言,C 語(yǔ)言中數(shù)組中的每個(gè)元素在內(nèi)存中是順序存放的,地址是遞增的,所以在 C++ 中也要兼容這個(gè)特性,而在 C++ 中唯有引用數(shù)組破快了這個(gè)特性,所以說(shuō) C++ 中不支持引用數(shù)組;&array[1] - &array[0] ?。?Expected ==> 4
printf("&sv.x = %p",&sv.x);
printf("&sv.y = %p",&sv.y);
printf("&sv.z = %p",&sv.z);
delete pc;
return 0;
}
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:16:14: error: declaration of ‘a(chǎn)rray’ as array of references
int& array[] = {a,b,*pc};
三、總結(jié):
指針是一個(gè)變量
引用是一個(gè)變量的新名字
const引用能夠生成新的只讀變量
在編譯器內(nèi)部使用指針常量實(shí)現(xiàn)"引用"
編譯時(shí)不能直接確定初始值的const標(biāo)識(shí)符都是只讀變量
好了,今天的分享就到這里,如果文章中有錯(cuò)誤或者不理解的地方,可以交流互動(dòng),一起進(jìn)步。我是txp,下期見(jiàn)!
-
可編程邏輯
+關(guān)注
關(guān)注
7文章
514瀏覽量
44054 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453 -
CONST
+關(guān)注
關(guān)注
0文章
43瀏覽量
8142
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論