前言
經過一下午的艱苦奮鬥,終於把這個書的第二章看完了。看完之後的感受就是明明這些東西都很簡單就是非要弄一個const進來,完全就是一個攪屎棍啊。但是這裏也開始逐步引入面向對象編程的思想了,其實在C語言也有一部分面向對象的思想在裏面,就是結構體。只不過在C語言中的結構體裏面只包含了數據,沒有包含方法。其它的廢話也不多說,前面比較簡答的2.1,2.2也就忽略了,可以自己下去看一下很簡單。我想在這裏寫出來是複合類型,就是那個加了const攪屎棍的東西
複合類型
複合類型比較多,我們下面一個一個的來介紹。
引用
引用(reference)其實就是我們小的時候經常被別人叫的外號,二狗子。在你那個村裏或者小區裏面,別人只要叫二狗子,就知道是叫的你。其實引用也是一樣,就是爲對象起一個別名。
今天我們就讓這個二狗子來幫助我們理解這複合類型。
int ival = 1024;
int &refval = ival;
int &errval;//這個時候系統會報錯
就像你在你們村裏被別人第一次取外號的時候,肯定是那個誰誰外號加二狗子。這樣別人才能通過二狗子找到你。相應的在程序中對於引用必須初始化也是理所應當的。
本來的外號是二狗子,不可能爲二狗子這個名字再取一個三娃子的外號吧。這也是在C++中不允許定義引用的引用因爲引用不是對象。
引用的內容比較少,下面我們來看一下他的異父異母的兄弟——指針
指針
指針就像二狗子的位置,吃過午飯你想去找二狗子玩,那麼就按着二狗子家的地址到了他家,發現二狗子在家。那麼這個時候就是一重指針;二狗子不在家,他爸爸在家告訴你二狗子去他奶奶家了,然後告訴你他奶奶家的地址,你又去他奶奶家找二狗子了,這就是二重指針。
下面我們來看一下C++中對於指針的定義。
int i = 1;
int *pi = &i;//這個&符號是對i對象進行取地址操作
通常情況下我們都要求指針類型和他所指向的對象嚴格匹配,因此在上一部分中我們講過,引用不是對象,所以不允許定義指向引用的指針。通常我們指針的值都應該屬於下列4種情況:
- 指向一個對象
int i = 1; int *pi = &i;
- 指向對象空間的下一個位置
- 空指針
- 其它情況,這個情況我也不是很清楚。
既然可以通過指針指向對象,那麼我們也可以使用指針操作對象
*pi = 0;
建議所有的指針都要進行初始化
特殊的指針
void*指針可用於存放任意對象的地址,但是相應的也有他的侷限,不然所有的指針都可以用這個指針定義,爲什麼還要保留那麼多指針類型。他的侷限在於不能操作所指的內存中的對象。
另外還有一個就是指向指針的指針,就是我們前面說到的去二狗子奶奶家找二狗子的例子。
int i = 0; //初始對象
int *pi = &i; //一重指針
int **ppi = π //二重指針
前面的內容都很簡單下面開始這一章的重點了,const攪屎棍。
const限定符
const的作用就是定義一種不能改變的變量,常量。但是由於他不能改變所以在定義的時候必須對其進行初始化,就如同下面一樣。
const int bufsize = 512;//確定輸入塊的大小,而且在後面的使用中也不會改變了。
const修飾的變量和其它變量一樣都是只能在文件內有效,如果要使其的作用範圍擴大到其它文件的話,必須使用extern關鍵字。
上面就是const基礎部分的內容,下面要將const和應用以及指針結合起來,這個時候就會變得複雜很多,讓我們來看看吧。
const的引用
我們直接總結結論:
- 不允許:非常量引用引用常量變量
- 允許:常量引用引用非常量變量,但是不能從常量引用處對非常量變量進行修改,但不妨礙通過其他方式修改非常量變量。
下面我們就來看一個例子:
//常量引用非常量
int i = 42;
const int &ri = i;
//非常量引用常量
const int t = 42;
int &rt = t;//這種方式是錯誤的
關於const和引用這一部分的內容還相對比較簡單,下面就來看看兩個噁心的東西混到一起是什麼東西。
指針和const
和前面引用一樣的,我們先對這一部分進行一個總結。
- 允許:指向常量的指針指向非常量對象
- 不允許:指向非常量的指針指向常量對象
另外還需要區分的一個東西是,指向常量的指針和常量指針
- 指向常量的指針:
const int * px;
這個是指針是指向常量 - 常量指針:
int *const px;
,這個是指針是常量,含義就是指向的地址是恆定不能改變的。
區分完這兩個概念之後緊接着來的就是關於頂層const和底層const,
- 頂層const:表示指針本身是個常量,常量指針;
- 底層const:表示所指對象是一個常量,指向常量的指針。
處理類型
typedef
使用C語言遺留下來的typedef
可以實現對類型進行別名操作。
typedef double wages;//wages是double的同義詞
using
這是C++11中引入的一種新方法,進行別名聲明。
using SI = Sales_item;//SI是Sales_item的同義詞
auto
這也是C++11全新引入的類型說明符。
auto item = val1 + val2;//item根據val1和val2相加的結構判斷類型
由於類型由賦值的對象判定,所以auto定義的變量必須有初始值。
decltype
*p = &i;
這裏面的難點就是decltype(*p)
的類型,大家可能認爲應該是int
。但是實際上這是一個引用類型,int&
。
爲什麼呢?
首先我們對於*p是不是可以對p所指的對象進行讀取和操作,然後這和直接對p所指的對象使用引用完全沒有區別啊。所以這個時候系統就判定 *p是作爲引用存在的。這也是我覺得這部分最難理解的地方。
總結
雖然一下午看起來很枯燥但是看完之後回顧一下還是感覺十分充實的。相信後面的內容會更加豐富和有趣(想啥呢)。那我們加油吧。準備迎接字符串,數組,向量的打擊吧!