引言
在 C++ 面向对象编程中,类不仅是数据与行为的封装单元,更是控制资源生命周期与安全性的关键。常规类往往默认允许拷贝、继承或在任意位置创建实例,但这在某些场景下会引发资源重复释放、内存泄漏或逻辑被篡改的风险。针对这些特殊约束,我们需要通过语言特性对类的行为进行精细化管控。本文将深入探讨五种典型特殊类的实现方案,涵盖拷贝控制、内存分配限制、继承封锁以及单例模式的构建。
设计不可拷贝的类
防止对象拷贝的核心在于禁用拷贝构造函数和赋值运算符。
在 C++98 标准中,通常将这两个函数声明为私有且不定义,从而阻止外部调用。到了 C++11,更推荐使用=delete显式删除它们,语义更清晰且能编译期报错。
class NoCopy {
public:
// C++11 方式:显式删除
NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
};
设计仅能在堆上创建的类
若需强制对象在堆上分配(例如管理长生命周期资源),可结合私有构造函数与静态工厂方法。
私有化构造函数阻止栈上直接实例化,而静态成员函数负责执行 new 操作并返回指针。同时配合不可拷贝规则,确保对象所有权明确。
class HeapOnly {
public:
static HeapOnly* CreateObj() { return new HeapOnly(); }
private:
HeapOnly() {}
HeapOnly(const HeapOnly&) = delete;
HeapOnly& operator=(const HeapOnly&) = delete;
};
设计仅能在栈上创建的类
反之,若希望对象严格位于栈上(如避免动态分配开销),需禁用 operator new。
同样将构造函数私有化,并提供一个静态工厂函数返回对象值。关键在于重载并删除全局 operator new,这样即使尝试使用 new 关键字也会编译失败。
class StackOnly {
public:
static StackOnly { (); }
:
() {}
= ;
};


