一、什么是?delete
?關鍵字
C++11 引入的?delete
?關鍵字是一種??顯式禁用函數??的語法機制。它允許開發者主動阻止特定函數的使用,比傳統的私有化聲明更直觀、更安全,且能在編譯期捕獲更多潛在錯誤。
二、為什么需要?delete
?
1. 傳統方式的缺陷(C++11 前)
class LegacyClass {
private:LegacyClass(const LegacyClass&); // 聲明為私有,禁止拷貝
};
問題:錯誤信息不明確(鏈接期報錯而非編譯期)
局限性:無法禁用全局函數和運算符
2.?delete
?的優勢
class ModernClass {
public:ModernClass(const ModernClass&) = delete; // 編譯期明確報錯
};
更早的錯誤檢查:在編譯階段直接報錯
更清晰的語義:明確表達設計意圖
靈活控制范圍:可禁用任意函數(包括全局函數)
三、核心應用場景
1. 禁用特殊成員函數
class NonCopyable {
public:NonCopyable() = default;NonCopyable(const NonCopyable&) = delete; // 禁用拷貝構造NonCopyable& operator=(const NonCopyable&) = delete; // 禁用拷貝賦值
};
2. 防止隱式類型轉換
class SafeInt {int value;
public:SafeInt(int x) : value(x) {}SafeInt(double) = delete; // 禁止從 double 隱式構造
};SafeInt s1 = 42; // OK
SafeInt s2 = 3.14; // 編譯錯誤!
3. 刪除不需要的函數重載
void Log(int id) { /*...*/ }
void Log(const char*) = delete; // 禁止字符串日志Log(42); // OK
Log("error"); // 編譯錯誤!