常量在c++裡面是乙個很重要的概念,有很多細節的地方很容易忽略,這裡我根據《c++程式設計思想》總結了一下。
1.出現的歷史
常量最普遍的用法是值替代,在c語言裡我們用巨集來定義常量:
#define max 100
但這是預編譯的,也就是說在編譯時只是簡單巨集展開,並不檢查巨集的語法是否正確。所以在c++裡引入了const來定義常量,增加了編譯時的檢查安全性得到了提高。(c99 裡面加入了const關鍵字)
const int size=100;
int array[size];
size在編譯時就知道是多少了。常量通常是儲存在符號表裡面的,沒有自己的記憶體位址,但我們可以強制編譯器為常量分配記憶體
const int i=100;
long address=(long)&i;
但要注意的是const可以用於集合,但必須保證編譯器不會複雜到把乙個集合儲存到它的符號表中,所以必須分配記憶體。在這種情況下,const意味著"不能改變的一塊儲存空間"。然而,不能在編譯期間使用它的值,因為編譯器在編譯期間不需要知道儲存的內容。
const int i=;
int f[i[3]]; //complie error
還有c++中預設const是內部連線的,生存期為這個程式的執行時間。
2.指標中常量
指向const的指標:
const int* p;
int const *p;
這兩種意義一樣都是說p指向的數是個常量,但p本身可以改變。
const指標:
int* const p=&d;
p指向的變數不一定是常量,但p本身不能再指向其它的變數。
兩種可以一起使用 const int* const p=&d; 就都不能改變。
要將const看成另外一種型別,轉換時要顯示轉換。
const int e=2;
int *w=(int*)&e; //legal but bad practice
3.函式引數和返回值
void f(const int i);
這種函式就認為在f裡面不會對 i 進行改變,呼叫時可以用常量,變數都行,但下面這種只能用變數做引數來呼叫
void f(int i);
返回const值
一般情況對於內部型別,我們都不會返回常量,但對於使用者定義的型別,按值返回常量就很重要了。如果乙個函式按值返回乙個類的物件為const是,那麼這個函式的返回值不能是乙個左值。
class
xvoid
modify()
};x f5()
const
x f6()
void
f7(x&x)
intmain()
上面例子f6返回的是常量,是不能成為左值的。
但f5返回的不是常量也有問題,因為返回值是個臨時量,編譯器使所有的臨時量自動地成為const,這時編譯器必須產生乙個臨時物件來儲存f5的返回值,如果f7的引數是按值傳遞的話,它在f7中生成那個臨時量的副本,能很好的工作,然而f7是按引用傳遞的,這意味著它取臨時量的位址,又f7的引數不是按const引用傳遞的,可能會對引數進行修改,問題就是編譯器在計算表示式結束時,該臨時物件也會不復存在了,對臨時物件的任何修改也將丟失。其實第一行也有同樣的問題,可惜編譯器不會有提示資訊。
常量綜述 二
引數傳遞和返回值的小結 void t int void u const int p const char v const int const w int main 函式t 可以用const和非const 指標做引數,而函式u 只能用const指標作為引數,而且編譯器也不允許使用儲存在const指標裡...
機器學習(一)綜述
剛碩士畢業了,趁著對所學知識還有記憶,趕快把之前筆記整理下,寫成部落格也方便整理。機器學習真是一門詭異的課程啊,感覺學了什麼又感覺什麼也沒學 主要內容 機器學習的基本過程 評估機器學習演算法 交叉檢驗 機器學習分為 監督學習 分類 1.1 決策樹 1.2 knn 1.3 svm 1.4 人工神經網路...
網路基礎 一 綜述
二 應用層 http 三 傳輸層 tcp udp 四 uri 和 url 1.計算機網路體系結構分層 osi七層模型 tcp ip協議族一般不是指tcp ip兩個協議,而是指利用 ip 進行通訊時所必須用到的協議群的統稱。tcp ip 協議族可以分為4層 應用層 傳輸層 網路層 資料鏈路層。應用層 ...