文章目錄
- 概述
- default
- delete
- 小結
概述
在看一些開源項目的源碼的時候,經常會看到default和delete。這2個關鍵字究竟什么意思呢?這篇文章就來一點一點拆解下。
default
默認構造函數、拷貝構造函數、移動構造函數、拷貝賦值運算符、移動賦值運算符和析構函數的顯式默認化;
C++11允許開發者使用 default 關鍵字來顯式要求編譯器生成默認的特殊成員函數。這通常用于當類需要自定義一些特殊成員函數,但又想保留其他成員函數的默認行為時。看如下代碼:
class MyClass {
public:MyClass() = default; // 顯式使用編譯器生成的默認構造函數MyClass(const MyClass&) = default; // 顯式使用編譯器生成的拷貝構造函數~MyClass() = default; // 顯式使用編譯器生成的默認析構函數// 其他成員函數...
};
delete
在C++中,delete 關鍵字用于刪除函數、構造函數或默認的特殊成員函數(默認構造函數、拷貝構造函數、移動構造函數、拷貝賦值運算符、移動賦值運算符和析構函數)。使用 delete 可以防止編譯器自動生成這些函數,或者覆蓋默認實現。
1.刪除默認構造函數:
如果一個類不需要默認構造函數,可以使用 delete 來刪除它。
class NoDefault {
public:NoDefault(int x) : x(x) {} // 只提供一個帶參數的構造函數
private:int x;
public:NoDefault() = delete; // 禁止使用默認構造函數
};
2.刪除拷貝構造函數和拷貝賦值運算符:
對于需要管理資源的類,可能不希望對象被拷貝,這時可以使用 delete 來刪除拷貝構造函數和拷貝賦值運算符。
如下代碼:
class NoCopy {
public:NoCopy(const NoCopy&) = delete;NoCopy& operator=(const NoCopy&) = delete;
};
3.刪除移動構造函數和移動賦值運算符:
如果類不需要移動語義,可以刪除移動構造函數和移動賦值運算符。
如下代碼:
class NoMove {
public:NoMove(NoMove&&) = delete;NoMove& operator=(NoMove&&) = delete;
};
4.刪除析構函數:
通常析構函數不會被刪除,因為它用于釋放資源。但是,如果類中沒有需要手動釋放的資源,可以刪除析構函數,讓編譯器生成默認的析構函數。
如下代碼:
class NoDestructor {
public:~NoDestructor() = delete; // 通常不推薦這樣做
};
5.刪除所有默認的特殊成員函數:
C++11引入了一種語法,可以一次性刪除所有默認的特殊成員函數。
如下代碼:
class AllDeleted {
public:AllDeleted() = delete;AllDeleted(const AllDeleted&) = delete;AllDeleted(AllDeleted&&) = delete;~AllDeleted() = delete;AllDeleted& operator=(const AllDeleted&) = delete;AllDeleted& operator=(AllDeleted&&) = delete;
};
小結
好了,看完這些,是不是有點了解了。以后看起來一些源代碼會輕松很多。感興趣嗎,一起學習。順便說一句,使用 delete 關鍵字可以提供對類行為更細致的控制,特別是在資源管理和對象生命周期管理方面。然而,過度使用 delete 可能會導致類的使用變得復雜和受限。OK,翻篇!