C++ Primer Reading Record Chapter 2 (1)

Randy Chen
Randy Chen
Published in
4 min readJul 27, 2019

第二章的內容,總算讀到告一個段落,總覺得是一個惡意滿滿的章節 加上 考驗你對繞口令的理解力,哈哈哈。

因為,從介紹參考、指標、const名詞 一直到 const參考、對const的指標、const指標,還有頂層const和底層const的影響之類的..... 讀這章的內容有點像是在rap的感覺.... 所以,就先對讀到的部分做個小小的紀錄,好讓讀到後面章節的我可以回過頭來複習一下XDD

首先,其實第二章主要是想介紹複合型別(compound type)這種變數的宣告方式。

複合型別變數的宣告,就是由一個基礎型別,後面再接著宣告器所組成。那在第二章的部分有引入 參考& 和 指標* 這兩種宣告器。

Example:

int val = 10; // 一般宣告,是由基礎型別int 和 變數名稱val所組成,

int &rval = val; // 複合型別宣告,是由 基礎型別int 、 宣告器&rval所組成。

Int *ptr = &val; // 複合型別宣告,是由 基礎型別int 、 宣告器*ptr所組成。

參考(reference)

參考是為一個物件定義了一個替代名稱。

有點像你自己有中文名字,但又有英文名字,所以,你在任何文件上不管簽的是你的中文姓名還是英文姓名,都代表你自己的感覺。

Ex:

int val = 42;

int &rval = val;

rval = 40; //同時,也把val的值改成40了

在參考的初始化時,就等同於繫結了某個物件,一旦該參考繫結了某個物件,就不能再把該參考重新繫結到別的物件上,所以,一個參考在定義的時候,就一定要直接繫結某個物件了,不能在定義它之後,沒有馬上進行初始化。

Ex:

int i = 42;

int &ri = i; // OK! 在定義參考ri時,馬上將它跟i進行繫結

int &rt; // Error! 定義參考rt,但沒有馬上將它跟別的物件進行繫結

參考在書中有一個一直提到的重點是,一個參考不是物件,而只是一個已存在物件的另一個別稱而已。

我對參考的感覺就好像它只是一個媒介而已,沒有一個真正實體的感覺, 因為真正有實體的是那些有被定義的物件。

那在左值參考(lvalue reference)的情境底下,因為參考不是物件,所以,我們不能定義對參考的一個參考(a reference to a reference)。那定義一個對參考的一個參考(有點像在rap ==)長得什麼樣子? 就是在原本參考&的旁邊再加一個&,像這樣int &&rval 。

我有查過對參考的一個參考可以在右值參考(rvalue reference)的情況下被使用,不過,我現在讀到的Primer第二章的部分,都還是以左值參考為主,所以,我就先不把右值參考的情況帶進來。

指標(pointer)

指標的功能相信大家都很熟悉,就是定義一個能夠存取別的物件位址的一個物件。

而指標跟參考很大的不同是,指標是一個物件,所以,以下三點是我覺得跟參考蠻不一樣的特性

1. 它能夠在定義的時候,不對該指標進行初始化

Ex:

int val = 42;

int &rval ; //Error! 定義參考rval,必須馬上對它初始化

int *ptr; // Ok! 定義指標ptr時,不馬上對它初始化

2. 一個指標物件,可以變換指定的對象,不像參考只能繫結一個物件

此處我假設以下例子中,val的位址是2000,val2的位址是2200

Ex:

int val = 42, val2 = 40;

int *ptr = &val; //Ok! 將ptr指向val

std::cout<<”&val= ”<<&val<<std::endl; //印出val的位址2000

std::cout<<”ptr= ”<<ptr<<std::endl; //印出ptr所儲存的位址,就是val的位址,所以會是2000

ptr = &val2; // Ok! ptr可以轉換指向的目標

std::cout<<”&val2= ”<<&val2<<std::endl; //印出val2的位址2200

std::cout<<”ptr= ”<<ptr<<std::endl; //印出ptr所儲存的位址,就是val2 的位址,所以會是2200

3.指標本身就是一個物件,不像參考本身並不是一個物件,所以,參考本身並沒有位址,想當然爾,我們就不能定義對參考的指標。

以上,就是我在書中,目前讀到有關對 參考 和 指標 的定義和特性的差別,做的小小整理,之後,還有對const這個名詞的運用,那部分就是真正惡意滿點的地方XDD。

--

--

Randy Chen
Randy Chen

Keep fertilizing it, Keep watering it, Keep marching on