系列文章目錄
C++11新特性使用詳解-持續更新
文章目錄
- 系列文章目錄
- 一、=default關鍵字
- 1. 為什么要引入=default關鍵字
- 2. 注意事項
- 3. 使用=default關鍵字有什么好處
- 4.實例代碼
- 二、=delete關鍵字
- 1. 為什么要引入=delete關鍵字
- 2. 注意事項
- 3. 使用場景
- 3.1刪除默認構造函數
- 3.2 刪除拷貝構造函數和拷貝賦值運算符
- 3.3 刪除重載操作符
- 3.4 為什么不直接刪除函數用
一、=default關鍵字
=default關鍵字是C++11標準中引入的一個新特性,它用于告訴編譯器生成默認的函數實現。
1. 為什么要引入=default關鍵字
在C++11之前,我們通常需要手動實現所有的函數,包括構造函數、拷貝構造函數、拷貝賦值運算符等等。但是有時候我們并不想為每個函數都編寫實現,這時候就可以使用=default關鍵字來生成默認的實現。
2. 注意事項
- 只能對具有合成版本的成員函數使用=default(即默認構造函數或拷貝控制成員)
- 如果我們已經為某個函數提供了實現,那么就不能再使用=default關鍵字了。這樣做會導致編譯錯誤。
- 類內用=default修飾成員的聲明時,合成的函數將隱式地聲明為內聯,如果不希望隱式內聯,應該只對成員的類外定義使用=default
- 當構造函數需要申請內存資源時,我們通常需要手動編寫構造函數的定義,并在其中使用適當的內存分配函數(如new)來申請內存。這樣可以確保在對象創建時分配所需的內存,并在析構函數中釋放這些內存。
3. 使用=default關鍵字有什么好處
它可以幫助我們減少代碼量,提高代碼的可讀性和可維護性。
但是需要注意的是,只有在必要的情況下才應該使用=default關鍵字,否則可能會影響程序的性能和可讀性。
4.實例代碼
class MyClass
{
public:MyClass() = default; //默認構造函數MyClass(const MyClass&) = default; //默認構拷貝造函數MyClass& operator = (const MyClass&) = default; //默認拷貝賦值運算符MyClass(int i) { a = i; }; private:int a;std::string s;char* p;
};int main()
{//defaultMyClass a1;MyClass a2 = a1;MyClass a3;a3 = a1;std::cout << "Hello World!\n";
}
二、=delete關鍵字
1. 為什么要引入=delete關鍵字
雖然大多數類應該定義拷貝構造函數和拷貝賦值運算符,無論是隱式的還是顯式的。但某些類這些操作沒有意義,這種情況下必須采用某種機制阻止拷貝或賦值。
=delete是C++11引入的一個新的關鍵字,它用于顯式地刪除一個已經定義的函數或操作符來阻止拷貝。
這個關鍵字告訴編譯器,我們不希望這個函數或操作符被調用,即使在代碼中出現了這樣的調用也會導致編譯錯誤。
比如iostream類阻止了拷貝,以避免多個對象寫入或讀取相同的IO緩存。
還有unique_ptrye阻止了拷貝,防止多個指針指向同一對象(破壞獨占性)。
2. 注意事項
不能刪除析構函數,如果析構函數被刪除,就無法銷毀此類型的臨時對象。
某一個成員的析構函數是刪除的,則該成員無法銷毀,因而整個對象也無法被銷毀
3. 使用場景
3.1刪除默認構造函數
默認構造函數是沒有參數的構造函數,它會在沒有提供其他構造函數的情況下自動生成。但是,如果我們不希望這個默認構造函數被調用,可以使用=delete關鍵字來刪除它。
class MyClass {
public:MyClass() = delete; // 刪除默認構造函數
};
3.2 刪除拷貝構造函數和拷貝賦值運算符
拷貝構造函數和拷貝賦值運算符用于創建一個新對象,并將其初始化為另一個同類型對象的副本。但是,如果我們不想讓對象被復制,可以使用=delete關鍵字來刪除這兩個操作符。
class MyClass {
public:MyClass(const MyClass&) = delete; // 刪除拷貝構造函數MyClass& operator=(const MyClass&) = delete; // 刪除拷貝賦值運算符
};
3.3 刪除重載操作符
我們可以在自定義類型上重載操作符,以便使用它們時就像使用內置類型一樣。但是,如果我們不想讓某個操作符被重載,可以使用=delete關鍵字來刪除它。
class MyClass {
public:void operator()(int x) = delete // 刪除重載了括號運算符
};
3.4 為什么不直接刪除函數用
直接刪除函數和用=delete關鍵字刪除函數的效果是一樣的,都是從代碼中移除了函數定義。但是,使用=delete關鍵字相比直接刪除函數,能更清晰、更明確地表達我們的意圖,提高代碼的可讀性和可維護性。
明確地告訴了編譯器和其他的開發者,這個函數是不應該被調用的。這樣,如果在代碼中出現了對這個函數的調用,編譯器就會報錯,避免了潛在的錯誤和bug。
幫助開發者更好地理解和閱讀代碼。通過查看函數前面的=delete關鍵字,我們可以快速地判斷出這個函數是否應該被調用,而不必去深入閱讀函數的實現細節。