const的主要主要用法有:
常變數: const 型別說明符 變數名
常引用: const 型別說明符 &引用名
常物件: 類名 const 物件名
常成員函式: 類名::fun(形參) const
常陣列: 型別說明符 const 陣列名[大小]
常指標: const 型別說明符* 指標名 ,型別說明符* const 指標名
例如:const int a; 或 int const a; 在c語言中宣告時必須進行初始化,c++中則沒有這個限制。c 標準中,const 定義的常量是全域性的,c++中視宣告位置而定。
const int *x; 指向常整型的指標,x所指向的資料不能被修改
int *const x; 指向整形的常量指標,x不能指向其它位址;
const int *const x;指向常整型的常量指標,x所指向的資料不能被修改,同時x自身也不能指向其他位址空間。
對於const int *x,雖然不能直接修改*x的值,但是我們可以通過下面的方式來修改:
int i = 10;const
int *x = &i;
int *p = (int *)x;
*p = 11
;
//此時i=11; *x= 11;
同樣在函式引數中使用指標常量和常量指標的意義是一樣的。 void f(const char *p); void f(char *const p);
如果引數作輸出用,不論它是什麼資料型別,也不論它採用「指標傳遞」還是「引用傳遞」,都不能加const 修飾,否則該引數將失去輸出功能。const 只能修飾輸入引數:如果輸入引數採用「指標傳遞」,那麼加const 修飾可以防止意外地改動該指標,起到保護作用。例如stringcopy 函式:
void stringcopy(char *strdestination, constchar *strsource);
其中strsource 是輸入引數,strdestination 是輸出引數。給strsource 加上const修飾後,如果函式體內的語句試圖改動strsource 的內容,編譯器將指出錯誤。
如果輸入引數採用「值傳遞」,由於函式將自動產生臨時變數用於複製該引數,該輸入引數本來就無需保護,所以不要加const 修飾。例如不要將函式void func1(int x) 寫成void func1(const int x)。同理不要將函式void func2(a a) 寫成void func2(const a a)。其中a 為使用者自定義的資料型別。
對於非內部資料型別的引數而言,象void func(a a) 這樣宣告的函式注定效率比較底。因為函式體內將產生a 型別的臨時物件用於複製引數a,而臨時物件的構造、複製、析構過程都將消耗時間。
為了提高效率,可以將函式宣告改為void func(a &a),因為「引用傳遞」僅借用一下引數的別名而已,不需要產生臨時物件。但是函式void func(a &a) 存在乙個缺點:
「引用傳遞」有可能改變引數a,這是我們不期望的。解決這個問題很容易,加const修飾即可,因此函式最終成為void func(const a &a)。以此類推,是否應將void func(int x) 改寫為void func(const int &x),以便提高效率?完全沒有必要,因為內部資料型別的引數不存在構造、析構的過程,而複製也非常快,「值傳遞」和「引用傳遞」的效率幾乎相當。
引用(reference)就是物件的另乙個名字,引用主要用作函式的形式引數。常量引用表示不能通過改引用去修改對應記憶體的內容。
int i = 10;const
int &j = i; //
不能通過j改變i的值
void func(const
int&i)
在乙個函式的簽名後面加上關鍵字const 後該函式就成了常量函式。對於常量函式,最關鍵的不同是編譯器不允許其修改類的資料成員
classtest
;void test::func() const
上面的**中,常量函式func 函式內試圖去改變資料成員intvalue的值,因此將在編譯的時候引發異常。
如果我們把乙個類定義為常量,我們的本意是希望他的狀態(資料成員)不會被改變。那麼,如果乙個常量的物件呼叫它的非常量函式會產生什麼後果呢?常量物件的狀態不允許被修改,又因為非常了得函式可以修改類的成員,因此,通過常量物件呼叫非常量函式時將會產生語法錯誤。
這裡就不總結了,具體的可以去看參考文件。
const定義的常量具有資料型別,定義資料型別的常量便於編譯器進行資料檢查,使程式可能出現錯誤進行排查。define進行巨集定義的時候,不會分配記憶體空間,編譯時會在main函式裡進行替換,只是單純的替換,不會進行任何檢查,比如型別,語句結構等,即巨集定義常量只是純粹的置換關係。
const讀書筆記
const的主要主要用法有 常變數 const 型別說明符 變數名 常引用 const 型別說明符 引用名 常物件 類名 const 物件名 常成員函式 類名 fun 形參 const 常陣列 型別說明符 const 陣列名 大小 常指標 const 型別說明符 指標名 型別說明符 const 指標...
C 讀書筆記 const修飾符
const 定義常量 const int i 1 i 不能改變 const指標 傳遞給函式的指標有四種方式 1.指向非常量的非常量指標 char s 2.指向常量的非常量指標 const char s 可用於指向常量物件的非常量指標 或對常量資料的引用 進行傳值,從而得到引用傳遞的效能 3.指向非常...
mysql運維 讀書筆記 Mysql 讀書筆記
mysql儲存時間有兩種型別 datetime和timestamp。分別說一下兩者的區別。datetime,以8位元組儲存時間,理論上可以從0000年儲存到9999年。並且沒有時區的概念,它儲存的就是乙個時間點的概念。timestamp和datetime最主要的不同就是,它是以4個位元組儲存,由19...