
实现方式
代码示例
class HeapOnly
{
public:
static HeapOnly* GreateObject()
{
return new HeapOnly();
}
private:
HeapOnly() {};
HeapOnly(const HeapOnly&) = delete;
};
int main()
{
// 成功,通过静态方法在堆上创建并返回对象
HeapOnly* p1 = HeapOnly::GreateObject();
// 失败,试图通过拷贝构造在栈上创建对象
HeapOnly p2(*p1);
return 0;
}
实现方式:屏蔽new
因为 new 在底层调用void* operator new(size_t size)函数,只需将该函数屏蔽掉即可。
代码示例
class StackOnly
{
private:
// 因为 new 和 delete 是搭配使用的
// 所以我们要禁的话就把两个都给禁了
void* operator new(size_t size) = delete;
void operator delete(void*) = delete;
};
实现方式:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
代码示例
class CopyBan
{
public:
// 一旦显示声明了拷贝构造,则编译器生成的默认构造函数就不存在了
// 反之则不会
CopyBan() {};
private:
CopyBan(const CopyBan&) = delete;
CopyBan& operator=(const CopyBan&) = delete;
};
C++98方式:将基类的构造函数私有化,这样派生类中就调不到基类的构造函数,也就无法继承。
class InheritBan
{
public:
// 通过静态方法返回在栈上创建的基类对象
static InheritBan GreateObjectOnStack()
{
return InheritBan();
}
// 通过静态方法返回在堆上创建的基类对象
static InheritBan* GreateObjectOnHeap()
{
return new InheritBan();
}
private:
// 构造函数私有,则派生类无法调用,也就实现不了继承
InheritBan() {};
};
C++11方式:通过 final 关键字修饰基类,表示该类不能被继承。
class A final
{
// ....
};