跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

C++ 特殊类设计:不可拷贝、堆栈限制及单例模式实现

C++ 特殊类设计旨在通过语言特性约束类的行为,包括禁止拷贝、限制内存分配区域、禁止继承及实现单例模式。核心手段涉及私有化构造函数、显式删除拷贝构造与赋值运算符、重载或删除 operator new 关键字。单例模式分为饿汉式与懒汉式,分别适用于不同初始化时机与资源管理场景,需注意线程安全与资源释放逻辑。

DevOpsTeam发布于 2026/2/6更新于 2026/5/2822 浏览
C++ 特殊类设计:不可拷贝、堆栈限制及单例模式实现

前言

在 C++ 面向对象编程体系中,类是封装数据与行为的核心单元。实际开发中常需面对具有特殊约束的场景:例如防止对象拷贝以规避资源重复释放风险,限定对象创建位置(仅堆或仅栈)以规范内存管理,禁止类被继承以保障核心逻辑不被篡改,或是确保类仅存在一个实例以实现全局资源统一调度。

本文系统拆解五种典型特殊类的实现逻辑与技术细节,结合 C++ 语言特性提供完整代码示例,并分析方案的优缺点与适用场景。

设计一个不能被拷贝的类

只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。

  • C++98 方法:将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有。
  • C++11 方法:用 delete 禁止生成拷贝构造函数和赋值运算符重载的默认成员函数。

设计一个只能在堆上创建对象的类

方法:让这个类不能被拷贝并且构造函数设置成私有的,然后再提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。

class HeapOnly {
public:
    static HeapOnly* CreateObj() {
        return new HeapOnly;
    }
private:
    HeapOnly() {}
    HeapOnly(const HeapOnly& hp) = delete;
    HeapOnly& operator=(const HeapOnly& hp) = delete;
};

设计一个只能在栈上创建对象的类

方法:先把构造函数私有化并且禁用 operator new,然后再搞个静态成员函数去构造对象。

引申:关于这里的 operator new,这个的话默认调用的是全局 new,这类里面这样搞了之后这个类就用不了 new 了。

class StackOnly {
public:
    static StackOnly CreateObj() {
        StackOnly st;
        return st;
    }
private:
    StackOnly() {}
    void* operator new(size_t size) = delete;
};

设计一个不能被继承的类

方法:

  1. C++98 方法:让构造函数私有化就行了。
  2. C++11 方法:用 final 关键字。

设计一个只能创建一个对象的类 (也叫做单例模式)

单例模式的概念:就是一个类只能创建一个对象。 作用:该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

单例模式的两种实现方法

饿汉模式

优点:实现起来简单。 缺点:

  1. 如果单例对象初始化内容很多,影响启动速度。
  2. 如果两个单例类,互相有依赖关系,这时候对实例化的顺序有要求——但是饿汉模式控制不了实例化的顺序(尤其是在不同的编译单元)。
namespace hungry {
class Singleton {
public:
    static Singleton& GetInstance() {
        return _sinst;
    }
private:
    Singleton() {}
    // 这里是防拷贝,演示的是 C++11 的方式
    Singleton(const Singleton& s) = delete;
    Singleton& operator=(const Singleton& s) = delete;
    static Singleton _sinst;
};
Singleton Singleton::_sinst;
}
懒汉模式
namespace lazy {
class Singleton {
public:
    static Singleton& GetInstance() {
        if (_psinst == nullptr) {
            _psinst = new Singleton;
        }
        return *_psinst;
    }
    static void DelInstance() {
        if (_psinst) {
            delete _psinst;
            _psinst = nullptr;
        }
    }
    class tmp {
    public:
        ~tmp() {
            lazy::Singleton::DelInstance();
        }
    };
private:
    Singleton() {}
    // 防拷贝
    Singleton(const Singleton& s) = delete;
    Singleton& operator=(const Singleton& s) = delete;
    static Singleton* _psinst;
    static tmp _tmp;
};
Singleton* Singleton::_psinst = nullptr; // 这意味着程序启动时,单例对象并没有被创建,仅仅是定义了一个指向它的空指针。
Singleton::tmp Singleton::_tmp;
}

一般单例不需要释放:因为程序结束的时候,操作系统会自动去回收的(用的不是析构函数)。 除非特殊场景:

  1. 中途需要显示释放。
  2. 程序结束时,需要做一些特殊动作(比如持久化)。

这里的第二种情况的持久化就是需要在程序结束时将数据写入其他地方——这个时候就需要调用析构函数,用析构函数写入——tmp 就保证了他的析构函数会起作用。

目录

  1. 前言
  2. 设计一个不能被拷贝的类
  3. 设计一个只能在堆上创建对象的类
  4. 设计一个只能在栈上创建对象的类
  5. 设计一个不能被继承的类
  6. 设计一个只能创建一个对象的类 (也叫做单例模式)
  7. 单例模式的两种实现方法
  8. 饿汉模式
  9. 懒汉模式
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Anaconda Prompt 环境下 GitHub 项目的 AI 辅助开发实践
  • Java 中使用 Lua 脚本实现 Redis 原子操作与高并发场景优化
  • AI 提示词实战指南:覆盖 20+ 高频场景与技巧
  • 豆包高效学习:AI 时代教育破局与认知升级指南
  • 从 Web 到 API 驱动:Django REST Framework 重构智能合同审查系统
  • 字节跳动前端一面深度解析:React 原理与浏览器渲染
  • OpenClaw 构建飞书 AI 办公机器人:本地 Ollama 接入与 Skills 自动化
  • DooTask 轻量级项目管理与 AI 协同功能解析
  • 执行式 AI 入门:API 调用与网络请求基础
  • MySQL 数据类型核心指南:选型、实战与避坑
  • Seq2Seq 模型实战:ScheduledEmbeddingTrainingHelper 原理与使用
  • SpringBoot 4.0 新特性整合项目实战应用详解
  • Cursor 集成 MCP 服务实战指南:从配置到自动化任务执行
  • pyenv-win Python 多版本管理实战与效率优化方案
  • JavaScript 调试技巧与实用工具指南
  • 基于 GLM4.7 的 Claude Code GitHub 代码自动审查
  • AI 对话页流式处理架构:Web Streams 与 Fetch API 实践
  • AIGC 产品经理工作职责与职位要求解析
  • Spring Boot 全局异常处理与日志监控实战
  • Linux 命名管道(FIFO)通信:原理与跨进程实战

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online