前言
在 C++ 面向对象编程体系中,类是封装数据与行为的核心单元,其设计直接关系到程序的安全性、可维护性与性能表现。除了支撑常规业务逻辑的普通类,实际开发中常需面对具有特殊约束的场景:例如防止对象拷贝以规避资源重复释放风险,限定对象创建位置(仅堆或仅栈)以规范内存管理,禁止类被继承以保障核心逻辑不被篡改,或是确保类仅存在一个实例以实现全局资源统一调度 —— 这些需求的实现,正是特殊类设计的核心范畴。
本文聚焦'特殊类设计'这一主题,系统拆解五种典型特殊类的实现逻辑与技术细节。从'不能被拷贝的类'对拷贝构造函数、赋值运算符的管控,到'只能在堆/栈上创建对象的类'对构造函数与内存分配接口的限制;从'不能被继承的类'基于构造函数私有化(C++98)与 final 关键字(C++11)的两种实现,到'单例模式(仅一个对象的类)'的饿汉模式与懒汉模式对比,每类设计均结合 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,然后再搞个静态成员函数去构造对象就行了。
–这里构造函数私有化的意义:防止外面例如 new A() 这样调用。
class StackOnly {
public:
static StackOnly CreateObj() {
StackOnly st;
return st;
}
private:
StackOnly() {}
= ;
};


