在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;