1. 只能在堆上创建对象的类
实现方式:
①:将类的构造函数私有化,拷贝构造声明私有或者delete;防止在栈上调用拷贝生成对象;
②:提供一个静态的成员函数,在该静态函数中完成堆对象的创建。
class HeapOnly
{
public:
static HeapOnly* CreateObject()//静态成员函数,调用该静态函数可获得堆对象
{
return new HeapOnly;
}
private:
HeapOnly(){}//私有化构造函数,则不能在栈上构造对象
HeapOnly(const HeapOnly&) = delete;//删除拷贝构造
};
上述代码是有问题的,因为会存在内存泄漏的问题,可使用智能指针,避免造成内存泄漏;
shared_ptr<HeapOnly> ho(HeapOnly::CreateObject());
//因为该对象是在堆上申请的,则可直接使用智能指针,而不用定制删除器
2. 只能在栈上创建对象的类
一、将构造函数私有化,然后设计静态方法创建对象返回即可;
class StackOnly
{
public:
static StackOnly CreateObject()//静态方法,创建对象然后返回
{
return StackOnly();
}
private://私有化构造函数
StackOnly() {}
};
二、屏蔽new,将该函数屏蔽掉,则就不会new出对象;
class StackOnly
{
public:
StackOnly() {}
void* operator new(size_t size) = delete;
void operator delete(void* ptr) = delete;
//或者私有化new 和 delete
//private:
// void* operator new(size_t size);
// void operator delete(void* ptr);
};
3. 不能被拷贝的类
禁掉拷贝构造和赋值运算符重载:
class CopyBan
{
public:
CopyBan() {}
CopyBan(const CopyBan&) = delete;
CopyBan& operator=(const CopyBan&) = delete;
//或者将 拷贝构造 和 赋值运算符重载 私有化
//private:
//CopyBan(const CopyBan&);
//CopyBan& operator=(const CopyBan&);
};
4. 不能被继承的类
C++98中,可采用将构造函数私有化的方式,则派生类调不到基类的构造函数,则无法继承;
C++11中,使用了final关键字,修饰类时,该类不能被继承
//C++98中
class CantInherit
{
public:
static CantInherit CreatObject()
{
return CantInherit();
}
private:
CantInherit(){}
};
//C++11中
class CantInherit2 final
{
//...
};