在C++編程中,特殊類設計和單例模式是兩個非常重要的高級主題。特殊類設計涉及到一些特定功能類的實現,如不可拷貝類、不可移動類等。而單例模式是一種創建型設計模式,保證一個類只有一個實例,并提供全局訪問點。本文將詳細介紹這兩個主題,并給出具體的實現示例。
一、特殊類設計
1. 不可拷貝類
有時候我們希望一個類的對象不能被拷貝,例如文件操作類、網絡連接類等。實現不可拷貝類的方法是將拷貝構造函數和拷貝賦值運算符聲明為私有或刪除。
class NonCopyable {
public:NonCopyable() = default;~NonCopyable() = default;// 刪除拷貝構造函數和拷貝賦值運算符NonCopyable(const NonCopyable&) = delete;NonCopyable& operator=(const NonCopyable&) = delete;
};
?
2. 不可移動類
不可移動類是指對象不能被移動。實現方法是將移動構造函數和移動賦值運算符聲明為私有或刪除。
class NonMovable {
public:NonMovable() = default;~NonMovable() = default;// 刪除移動構造函數和移動賦值運算符NonMovable(NonMovable&&) = delete;NonMovable& operator=(NonMovable&&) = delete;
};
?
3. 靜態多態類
通過CRTP(Curiously Recurring Template Pattern)實現靜態多態類,可以在編譯期實現多態,提高運行時性能。
template <typename Derived>
class Base {
public:void interface() {static_cast<Derived*>(this)->implementation();}// 可以定義一些默認行為void implementation() {// 默認實現}
};class Derived : public Base<Derived> {
public:void implementation() {// 自定義實現}
};
?
二、單例模式
單例模式確保一個類只有一個實例,并提供一個全局訪問點。常見的實現方法有懶漢式、餓漢式和線程安全的單例。
1. 懶漢式單例
懶漢式單例在第一次使用時創建實例,適用于不需要線程安全的場景。
class Singleton {
public:static Singleton& getInstance() {static Singleton instance;return instance;}private:Singleton() = default;~Singleton() = default;// 禁止拷貝和賦值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
?
2. 餓漢式單例
餓漢式單例在程序啟動時創建實例,適用于需要線程安全的場景,但會在未使用時也創建實例。
class Singleton {
public:static Singleton& getInstance() {return instance;}private:Singleton() = default;~Singleton() = default;static Singleton instance;// 禁止拷貝和賦值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};// 靜態成員初始化
Singleton Singleton::instance;
?
3. 線程安全的單例
使用C++11中的?std::call_once
和?std::once_flag
實現線程安全的懶漢式單例。
#include <mutex>class Singleton {
public:static Singleton& getInstance() {std::call_once(initInstanceFlag, &Singleton::initSingleton);return *instance;}private:Singleton() = default;~Singleton() = default;static void initSingleton() {instance = new Singleton();}static Singleton* instance;static std::once_flag initInstanceFlag;// 禁止拷貝和賦值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};// 靜態成員初始化
Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;