1. 程式人生 > 實用技巧 >c++11學習筆記(1)

c++11學習筆記(1)

(1)引用是為了儘量避免拷貝操作,節省空間。
(2)函式只能返回一個數值,使用引用可以間接返回多個數值。
(3)要儘量使用常量引用,不能把const物件、字面值或者需要型別轉換的物件傳遞給普通的引用形參。
(4)當陣列作為形參的時候。因為不能拷貝陣列,所以我們無法以值傳遞的方式使用陣列引數。因為陣列會被轉換成指標,所以當我們為函式傳遞一個數組的時候,實際上傳遞的是指向陣列首元素的指標。
(5)頂層const是指標常量,就是這個指標地址不能再變,但是內容可以改變。語法規則就是const必須在*後面

int *const a = &b

(6)底層const是指指標地址可以改變,但這個地址存放的數值不能改變了,也就是說解引用不能賦值。

int const *a = &b
const int *a = &b

(7)在類的成員函式末尾加上const稱為常量成員函式,定義一個常量成員函式實質上是把this指標在該成員函式內定義成指向常量的常量指標。因此,常量成員函式體內this指標不能重新定向,它總是指向呼叫該常量成員函式的物件。而且,該物件的資料成員也不能被修改。
(8)每個類成員函式裡面有個隱式的this指標,當模仿內建運算子的時候要返回引用型別,採用return *this的方式進行返回,這樣就可以返回當前的引用。
(9)預設情況下,拷貝類的物件其實拷貝的是物件的資料成員。
(10)建構函式沒有返回型別,不能被宣告成const的,建構函式在const物件的構造過程中可以向其寫入數值。


(11)合成的預設建構函式只適合非常簡單的類,對於一個普通的類。必須定義它自己的預設建構函式。
(12)

sales_data(const string &s, unsigned n, double p): bookno(s), units(n), revenue(p*n) 
{ }

那個部分叫做建構函式初始值列表。
(13)如果在類的外部定義建構函式,以is stream為引數的建構函式需要執行一些實際的操作,比如呼叫read函式給資料成員賦以初值。
(14)很多需要動態記憶體的類能夠使用vector物件或者string物件管理必要的儲存空間。使用這兩種類能避免分配和釋放記憶體帶來的複雜性。如果類包含vector或者string成員,則其拷貝、賦值和銷燬的合成版本能夠正常工作。


(15)private成員可以被類的成員函式訪問,但是不能被使用該類的程式碼訪問。
(16)struct和class的預設訪問許可權不太一樣。類可以在它的第一個訪問說明符之前定義成員,對這種成員的訪問許可權依賴於類定義的方式。如果我們使用struct關鍵字,則定義在第一個訪問說明符之前的成員是public的。
(17)類可以允許其他類或者函式訪問它的私有成員,方法是另其他類或者成員函式成為它的友元。如果類想把一個函式作為它的友元,只需要增加一條以friend關鍵字開始的函式宣告語句即可。

class saledata{
  friend saledata add(const saledata& , const saledata&)
public
private
}

友元宣告只能出現在類定義的內部,但是在類內出現的具體位置不限。一般來說,最好在類開始或結束前的位置集中宣告友元。

注意是獨立於public和private的。
(18)封裝的好處就在於,一個是確保使用者程式碼不會無意間破壞封裝物件的狀態。

第二個是被封裝的類的具體實現細節可以隨時改變,而無需調整使用者級別的程式碼。
(19)把資料成員的訪問許可權設成private還有另外一個好處,能夠防止由於使用者的原因造成資料被破壞。如果我們發現有程式缺陷破壞了物件的狀態,也可以在有限的範圍內定位缺陷。將查錯限制在有限範圍內能極大降低維護程式碼和修正程式錯誤的速度。
(20)

typedef std:: string::size_type pos

等價的可以使用類型別名如下

using pos = std::string::size_type

(21)有時候(但並不頻繁)會發生這樣一種情況,我們希望能修改類的某個資料成員,即使是在一個const成員函式內,可以通過在變數的宣告中加入mutable關鍵字做到這一點。

class screen{
public:
  void some_member() const;
private:
  mutable size_t access_ctr;

//即使在一個const物件內也能被修改}

void screen:: some_member() const
{
  ++ access_str;
}