溫習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類資料。常量指標本身是可...