文章目录
- 一、请设计一个类,只能在堆上创建对象
- 二、请设计一个类,只能在栈上创建对象
- 三、请设计一个类,不能被拷贝
- 四、请设计一个类,不能被继承
一、请设计一个类,只能在堆上创建对象
实现方式
- 将类的构造函数私有,并禁用拷贝构造函数(目的是防止别人调用拷贝在栈上生成对象)
- 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建
代码示例
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
{// ....
};