常量和引用

2021-08-09 05:31:24 字數 1992 閱讀 3087

溫習c++至引用部分,做如下整理。

用於修飾變數,表明不能修改。常用於修飾函式引數和普通變數。常問的點有指標常量和常量指標。

指標常量:int * const p; 表明指標p是乙個常量,指向乙個int行變數。

int a;  

int b;

int * const p = &a;

p = &b; //指標p不可修改

常量指標: const int *p; 表明p指向是乙個int型的常量。

int a = 1;

const

int b = 2;

const

int *p = &a;

p = &b;

*p = 2; //錯,p指向的內容不可修改

記憶的話很好記,常量指標就是 先常量(const)再指標(*),指標常量相反。

標明不可改變

當希望函式引數在函式內部不改變,可用const修飾。對基本資料型別int等無必要,對指標和類可用.如

void fun(const

char *pstr);

void fun(a a);

void fun(const a &a); /* 當希望物件a不可改變時,為減少對臨時物件的拷貝,複製,析構,可以使用物件a的const引用。*/

常用的用法,修飾不可更改的變數。

希望函式返回值不可改變,如string的c_str用法。

const

char * c_str(std::string str);

任何不會修改資料成員的函式都應該宣告為const 型別。如果在編寫const 成員函式時,不慎修改了資料成員,或者呼叫了其它非const 成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性

class stack  

;

開始學習的時候都說引用是乙個別名,個人感覺太籠統,查閱相關資料(c++中引用的本質)並自行驗證後發現引用就是乙個指標,有位址空間,內部存放其他變數的位址。

例證如下:從組合語言來看,兩者本質一樣。

int i=5;

00a013de mov dword ptr [i],5

//將文字常量5送入變數i

int &ri=i;

00a013e5 lea eax,[i] //將變數i的位址送入暫存器eax

00a013e8 mov dword ptr [ri],eax //將暫存器的內容(也就是變數i的位址)送入變數ri

ri=8;

00a013eb mov eax,dword ptr [ri] //將變數ri的值送入暫存器eax

00a013ee mov dword ptr [eax],8

//將數值8送入以eax的內容為位址的單元中

return

0;00a013f4 xor eax,eax

這裡順便提到一些概念。變數只是編譯器給的乙個抽象概念,實際上只有位址和位址空間內容。

區別在於const引用可以繫結到類似型別和右值上。不過不可修改。例:

double d = 12.12;

const

int & a = d;

const

int & b = 12;

非const引用不能繫結右值和類似型別,只能繫結同型別。例:

double d = 12.12;

int & a = 1; //錯,不能繫結右值

int & b = d;//錯,不能繫結非 同型別的變數

int aa = 1;

int & c = aa; //對

為何如此呢,具體原因可看c++設計和演化,在c++2.0時做出了該規定。

引用,指標,常量引用,常量指標,指標常量的區別

1.指標 指標代表乙個變數的位址 例如 int a 2,b 1,pi a pi b 2.引用 引用即針對乙個變數的別名,引用必須被初始化,引用作為引數 形參 時,不會像指標一樣使用儲存單元,更不會像值傳遞一樣建立該引數的副本,提高空間 時間效率。例如 int a 2,b a 3.常量引用 格式為 c...

指標和引用與及指標常量和常量指標

1.存在空指標,但是不存在空引用。2.指標可以不初始化,而引用必須初始化,並且,引用的目標一旦確定,後面不能再更改,指標可以更改其指向的目標。3.指標是乙個實體,而引用僅是個別名。4.引用是型別安全的,而指標不是 引用比指標多了型別檢查 5.指標和引用的自增 運算意義不一樣,對引用的操作直接反應到所...

C 常量指標 指標常量 引用和常引用的用法解析

今天學習c 的常量型別和引用,其中常量指標 指標常量 引用和常引用幾個概念較為接近,特地整理一下。1.常量指標 pointer to const 常量指標,顧名思義,是指向常量的指標,其定義的一般形式為 const t pointer name t為資料型別,target為t類資料。常量指標本身是可...