1. 程式人生 > >Effictive C++條款整理計劃(11-20)

Effictive C++條款整理計劃(11-20)

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. 複製物件時勿忘每一個成分

  1. copying函式應該確保複製“物件內的所有成員變數”以及“所有基類成分”

  2. 不要嘗試以某個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. 以物件管理資源

  1. 為了防止資源洩露,請使用RAII物件,它們在建構函式中獲得資源並在解構函式中釋放資源。必須lock_guard。
  2. 常備使用的有unique_ptr和shared_ptr

14. 在資源管理中心類中小心copy行為

常見的做法是抑制copy

15. 在資源管理類中提供對原始資源的訪問

16. 成對使用new和delete時要採取相同的形式

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,表明執行期也無法修改該值,所以儘量採用該方法進行值傳遞。