Effective C 學習總結

2021-10-25 03:29:11 字數 1801 閱讀 8399

pass by value 高效的情況有:

內建型別如 int bool 指標等使用pass by value高效;

stl的迭代器和演算法函式指標同樣使用pass by value,因為其是基於指標實現的;

pass by reference的情況:

自定義型別使用pass by reference to const高效,避免拷貝建構函式開銷;

同時可以避免拷貝截斷的問題,如下:

class derive : public base;

derive d;

void print(base b);

print(d);// 只拷貝了基類的成員變數;沒有多型的功能;

void print(const base &b);

print(d);// 拷貝了子類所有成員變數;有多型功能;類似基類指標;

類內static const 成員變數,如果是基礎資料型別,可在類內進行初始化(只有宣告,沒有定義);

非基礎資料型別,必須同時有宣告和定義。**如下:

// class.h 檔案

class test ;

// class.cc

const std::string test::string_ = "123456"; //類外初始化不能帶static關鍵字

建構函式做了什麼?按照什麼順序?

開闢記憶體空間.

按照成員變數宣告的順序開始構造成員變數.

進入函式體, 執行語句.

base class 的呼叫早於 derived class, 成員變數初始化,按照宣告的順序進行初始化。

class dbconn 

~dbconn()

catch(...)

}} private:

dbconnection db;

bool closed;

}

建構函式和析構函式不要呼叫virtual函式,也不要呼叫使用了virtual函式的non-virtual函式,因為在執行base的建構函式和析構函式時,其本身是base型別,不會存在多型的作用。

通過base建構函式入參傳入不同的資料(例如不同的日誌string),進而呼叫non-virtual函式,製造不同的執行效果。(個人感覺,這個用處不是很大,應用場景很有限)

為了處理連續賦值的操作如下:

int a, b, c;

a = b = c = 15;

class base

...};

a[i] = a[j];

class bitmap ;

class widget ;

// 異常情況不安全的做法

widget& widget::operator=(const widget &rhs)

// 好方法一,不管是不是同乙個物件都new乙個新的,如果是大記憶體物件效率會較低;

widget& widget::operator=(const widget& rhs)

// 好方法二,copy and swap

void swap(widget& rsh) // 交換*this和rsh的內容;

widget& widget::operator=(const widget& rhs)

// 好方法二,copy and swap, 建構函式從函式體內移至函式引數構造階段,編譯器可能可以生成更高效的指令。

widget& widget::operator=(widget rhs)

effective c 條款11學習總結

1.為需要動態分配記憶體的類宣告乙個拷貝建構函式和乙個賦值操作符 只要類裡有指標時,就要寫自己版本的拷貝建構函式和賦值操作符函式。在這些函式裡,你可以拷貝那些被指向的資料結構,從而使每個物件 都有自己的拷貝 或者你可以採用某種引用計數機制去跟蹤當前有多少個物件指向某個資料結構。引用計數的方法更複雜,...

effective c 條款13學習總結

條款13 初始化列表中成員列出的順序和它們在類中宣告的順序相同 如果成員按它們在初始化列表上出現的順序被初始化,那w1和w2中的資料成員被建立的順序就會不同。我們知道,對乙個物件的所有成員來說,它們的析構函式被呼叫的順序總是和它們在建構函式裡被建立的順序相反。那麼,如果允許上面的情況 即,成員按它們...

effective c 條款13學習總結

條款13 初始化列表中成員列出的順序和它們在類中宣告的順序相同 如果成員按它們在初始化列表上出現的順序被初始化,那w1和w2中的資料成員被建立的順序就會不同。我們知道,對乙個物件的所有成員來說,它們的析構函式被呼叫的順序總是和它們在建構函式裡被建立的順序相反。那麼,如果允許上面的情況 即,成員按它們...