常量綜述 一

2021-04-12 17:16:43 字數 1645 閱讀 9529

常量在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層 應用層 傳輸層 網路層 資料鏈路層。應用層 ...