可不能小瞧了 const

2021-08-09 23:18:11 字數 2073 閱讀 5931

有的時候我們需要在程式中使用這麼一種一種變數,希望他們的值在定義了之後就不會在改變了,於是就有了 const 這個修飾符,也正因為用 const 修飾的變數的值不可以被修改,所以在定義的時候就要求必須給予初值。

當乙個指標或引用和 const 結合時會發生很多美妙的事情,嘿嘿。我們知道指標是乙個物件,但引用不是(這裡也有很多有趣的問題),指標可以指向另外乙個物件,這時指標本身是不是常量和指標所指的那個物件是不是常量就是乙個值得思考的問題。我們可以把 const 細分為頂層 const (top level const ,和指標結合時用來表示指標本身是乙個常量),和底層 const (low level const ,和指標結合時用來表示指標所指的物件是乙個常量)。頂層 const 可以表示常量物件,而底層 const 則是修飾指標或引用時產生的一種現象。

int num = 1;

int *const ptr = # // 定義了乙個頂層 const ,ptr 的值不可以被改變

const int *ptr1 = # // 定義了乙個底層 const ,ptr1 的值可以被修改

const int *const ptr2 = &num // *號左邊的是底層 const, *號右邊的是頂層 const

const int &r = num; // 修飾引用的 const 都是底層 const

發生拷貝時,頂層和底層 const 會有很大的區別,頂層 const 往往不會影響賦值,因為,把乙個常量物件賦給乙個普通物件時,只是把常量物件的值拷貝了乙份給普通物件,對普通物件的操作並不會影響到常量物件,而把乙個普通物件賦給乙個常量物件時,更是沒有問題,普通物件也只是把它的值拷貝了乙份給常量物件,只是常量物件自己限制自己的值不可被改變而已,比如

const int num1 = num;           // 可以用普通物件來初始化乙個頂層 const 的物件

num = num1; // 可以把乙個頂層 const 的值賦給乙個普通物件

// 但是,當變數具有底層 const 屬性時就不一樣了,比如

int *ptr3 = ptr1; // 非法,ptr1 具有底層 const 屬性,而 ptr3 沒有,我們也可以自然的想到,

// 如果可以的話,那麼就可以通過 ptr3 修改 ptr1 指向的物件了,但是 ptr1 認為自己指向

// 的是乙個常量物件,這樣會局面會混亂,所以編譯器拒絕這樣的寫法也是合理的。

ptr1 = ptr2; // 正常,ptr2 和 ptr1 都具有底層 const 屬性,而 ptr2 的頂層 const 會被忽略

還有當用乙個具有頂層 const 屬性的物件去初始化乙個 auto 推導出的型別時,物件的頂層 const 屬性會被忽略掉。但是定義乙個 auto 型別的引用時,推導出來的型別仍然具有頂層 const 屬性。decltype 的作用和 auto 差不多,但是用法上有些不同。decltype 遇到頂層 const 和引用時得到的結果與 auto 有所不同,如果 decltype 內的表示式是乙個變數,decltype 推導出的型別會包括該變數的頂層 const 屬性和引用。

const int knum = 0, &r = knum;

auto a = knum; // a 為 int 型別,knum 的頂層 const 屬性被忽略

auto &b = knum; // b 為 const int & 型別,knum 的頂層 const 屬性被保留

auto c = r; // 這樣的寫法並不能得到引用型別,r 是 knum 的乙個別名,這裡會按照 knum 來推導型別,所以得到的還是 int 型別

decltype(knum) d = 0; // d 為 const int 型別

decltype(r) e = d; // e 為 const int & 型別

不要小瞧了sprintf函式

sprintf 函式 標頭檔案 include 原型 int sprintf char buffer,const char format,argument 功能 字串格式化命令,主要功能是把格式化的資料寫入某個字串中。sprintf 是個變參函式。引數 buffer char型指標 指向將要寫入的字...

區塊鏈是怎麼交易,交易記錄可不能撤銷

區塊鏈中有兩把鑰匙,一把公鑰,一把私鑰。這兩個鑰匙是通過一種數學演算法得出來的,有關聯的一對鑰匙。說的簡單點,就是私鑰可以生成公鑰,而公鑰是無法推導出私鑰的,所以來說很安全。在區塊鏈中,公鑰是公開的鑰匙,是要公開發行配送的,只要有要求誰都能取得。私鑰就是私人才擁有的了,就像你的保險櫃鑰匙,你不可能拿...

跳閘後推不上去?漏電保護器可不能背鍋!

冬夏兩季用電量大,偶爾會遇到跳閘的情況,大家往www.cppcns.com往會認為是漏電保護器出了問題,但跳閘情況複雜。如果嘗試合閘不成功,排除自身故障外,還有可能是線路短路,程式設計客棧漏電,超負荷,電器裝置故障等等情況,甚至可以從中窺見家居電氣布局不合理的地方,所以跳閘問題可不能輕視。以西門子綠...