c 深入理解const以及相關聯的引用知識

2021-09-07 20:14:26 字數 2355 閱讀 9919

/*

書籍: c++primer 第五版 c++11標準

*/

const的分類
const分為兩種, 一種是底層的const, 一種為頂層的const

底層const

底層的const表示指向是常量, 指標本身是變數或者變數

頂層const

頂層const表示指標本身是常量, 指向為變數或者常量

const的賦值含義

//省略標頭檔案以及命名空間

int a[10] = ;

int* c1 = a; //可以通過c1改變陣列的值, c1也可以指向其餘陣列

int* const c2 = a;//必須初始化, c2本身是乙個常量, 只能指向a陣列, 初始化就不能改變, 但是可以通過c2改變陣列的值

const int* c3 = a;//無所謂初始化, 不能通過c3改變陣列的值, 但是c3本身是乙個變數, 可以指向其餘的陣列

//上述可得, c2就是頂層const, c3就是底層const

/*

書籍: c++primer 第五版 c++11標準

p256

*/

在書籍的建構函式處, 關於初始化const資料成員的方法的時候總結下列幾點

1. 如果成員是`const` , 引用, 或者屬於某種未提供預設建構函式的型別, 我們必須通過建構函式初始化列表來為這些成員賦值

2. 建構函式的初始化應該和定義順序一致, 並且避免使用用乙個資料成員去初始化另乙個資料成員

補充以前對於const以及指標引用的錯誤理解

錯誤理解

1. 不能對常量進行引用

以前理解為常量例如 20 40 等數值的引用, 以前的想法覺得肯定是錯誤的, 在書的p55面有詳細的解釋,如下:

常量引用是對const的引用

第一種以前的證明如下

#include using namespace std;

int main()

在centos上的結果報錯內容如下

1.cpp: in function 『int main()』:

1.cpp:7: error: invalid initialization of non-const reference of type 『int&』 from a temporary of type 『int』

2. 引用時兩邊物件的型別必須保持一致

#include using namespace std;

int main()

[root@hncuc test]# g++ 1.cpp

1.cpp: in function 『int main()』:

1.cpp:8: error: invalid initialization of reference of type 『int&』 from expression of type 『double』

c++程式設計師經常把對const的引用簡稱為"常量引用", 嚴格的來說並不存在常量引用, 因為引用不是乙個物件,

所有我們沒法讓引用本身恆定不變.

事實上, 由於c++語言並不允許隨便改變引用所繫結的物件, 所以從這層意義上理解所有的引用都算是常量

引用的物件是常量還是非常量可以決定於其所能參與的操作, 卻無論如何都不會影響到物件和引用本身的

繫結關係特指出兩個特殊情況

第一種情況: 初始化常量引用時允許用任意表示式作為初始值, 只要該表示式的值能夠被轉換為引用型別即可,

尤其允許為乙個常量引用繫結乙個表示式and物件and欄位例如:

#include using namespace std;

int main()

接下來深入**一下如果當b不是常量的時候會發生什麼事情, 這個時候b如果還能引用到a會發生什麼事情呢, 我們知道編譯器

會有這個轉換的過程, 那麼其實b引用的就是這個中間變數, 就算想通過賦值給b來改變a的值也會無法完成, 所以我們得出結論

只有加上const, 因為加上const以後我們無法改變這個引用的值,也就無法通過複製來改變繫結物件的值

由此我自己又產生乙個疑問, 既然時常量那麼無法改變, 那我們改變物件的值會不會對這個常量引用的值造成影響呢?

#include using namespace std;

int main()

結果出乎意料, 輸出c的值居然時15, 所以我們得出結論如下

當為常量引用的時候如果我們改變物件的值依然會對常量引用的值產生改變. 但是我們無法通過改變引用的值來改變物件, 理由就像

我們前面說的, 此時常量引用繫結的是編譯器產生的中間變數

深入理解C 函式過載const

書上和網上在很多地方都對const 的過載做了一些解釋,但感覺都不是很詳細。還有很多同學在不同的地方發問關於const 過載的問題,這裡我又重新看了一下,做了乙個簡單的分析也可能有不對的地方,歡迎討論。所謂過載,是指允許存在多個同名函式,而這些函式的參數列不同,即函式名相同但函式的簽名不同。過載並不...

快速冪 快速相關聯等 的理解,

記錄一下當時是怎麼理解的,以備後面忘記可以回顧。快速冪普通求 ab,就是讓aaa 乘b次,時間複雜度為o n 快速冪 能快到o log n 原理是 比如 a5。5 二進位制為 0101 a5 a 2 01 2 10 2 2 1 5 20 1 21 0 2 2 1 a 5 a 2 0 1 a 2 1 ...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...