Effictive C++條款整理計劃(11-20)
阿新 • • 發佈:2018-12-23
11. 在operator=中處理自我賦值
該條款說的是,在operator函式中,應該先判斷是否在進行自賦值,如果是自賦值,應該直接返回*this,而不是繼續進行自我賦值
class Student { public: Student(int age):m_age(age) {} ~Student() {} private: Student& operator=(const Student& rhs) { //條款11 if (this == &rhs) { return *this; } m_age = rhs.m_age; return *this; } int m_age; };
12. 複製物件時勿忘每一個成分
-
copying函式應該確保複製“物件內的所有成員變數”以及“所有基類成分”
-
不要嘗試以某個copying函式實現另一個copying函式,而應該將共同的機能放進第三個函式中,並由copying函式共同呼叫。
class BoyStudent : public Student { public: BoyStudent(int name,string sex):Student(name),m_sex(sex){} BoyStudent& operator=(const BoyStudent& rhs) { if (this == &rhs) { return *this; } //重點,必須要複製所有的成分 Student::operator=(rhs); m_sex = rhs.m_sex; } private: string m_sex; };
13. 以物件管理資源
- 為了防止資源洩露,請使用RAII物件,它們在建構函式中獲得資源並在解構函式中釋放資源。必須lock_guard。
- 常備使用的有unique_ptr和shared_ptr
14. 在資源管理中心類中小心copy行為
常見的做法是抑制copy
15. 在資源管理類中提供對原始資源的訪問
16. 成對使用new和delete時要採取相同的形式
17. 以獨立語句將new創建出來的物件置入智慧指標中
以獨立的語句將newed物件置於智慧指標內,如果不這樣做,一旦有異常別丟擲,有可能導致難以察覺的資源洩露,對於shared_ptr,推薦使用std::make_shared來進行賦值,對於unique_ptr,推薦使用std::unique_ptr來進行賦值。
18. 讓介面容易被正確使用,不易被誤用
- 阻止誤用的辦法包括建立新的型別。限制類型上的操作,束縛物件值,以及消除客戶的資源管理責任。
19. 設計class猶如type
- 新type的物件應該如何被建立和銷燬
- 物件的初始化和物件的賦值該有什麼樣的差別(拷貝建構函式和operator=)
- 新type的物件如果被以pass-by-value(以值傳遞),意味著什麼?(拷貝建構函式會被呼叫)
- 什麼是新type的“合法值”
- 新type的需要繼承嗎?(析構virtual)
- 新的type需要什麼樣的轉換(建構函式的過載或者explict)
- 什麼樣的操作符對此新的type而言是合法的
- 什麼樣的標準函式應該被駁回(private函式)
- 新的type有多麼一般化(模板類)
20. 寧以pass-by-reference-to-const替換pass-by-value
pass-by-reference-to-const說的是const引用或者const指標,pass-by-value說的普通的值傳遞。因為by-refernce傳遞的是地址,所以只有4個位元組的copy,而by-value需要先建立一個物件,在然後賦值,所以會有不如以pass-by-reference-to-const來進行傳遞,加上const,表明執行期也無法修改該值,所以儘量採用該方法進行值傳遞。