一、不能被拷贝
1、设置为私有
将赋值重载和拷贝构造声明为私有:
class CopyBan1
{
public:private:CopyBan1(const CopyBan1& cb);CopyBan1& operator=(const CopyBan1& cb);
};
2、delete
在默认成员函数后加上 =delete,表示让编译器删除该默认成员函数:
class CopyBan2
{
public:CopyBan2(const CopyBan2& cb) = delete;CopyBan2& operator=(const CopyBan2& cb) = delete;
};
二、只能在堆上创建
1、构造函数私有化
class HeapOnly1
{
public:static HeapOnly1* create(){return new HeapOnly1;}~HeapOnly1(){cout << "~HeapOnly1" << endl;}//禁拷贝,防止在栈上创建对象HeapOnly1(const HeapOnly1& ho) = delete;HeapOnly1& operator=(const HeapOnly1& ho) = delete;private:HeapOnly1(){}};
2、析构函数私有化
//析构函数私有
class HeapOnly2
{
public://static void Destroy(HeapOnly2* ptr)//{// delete ptr;//}void Destroy(){delete this;}private:~HeapOnly2(){cout << "~HeapOnly2" << endl;}};
三、只能在栈上创建
class StackOnly1
{
public:static StackOnly1 create(){return StackOnly1();}//禁new(或和deletevoid* operator new(size_t size) = delete;//void operator delete(void* p) = delete;private:StackOnly1(){cout << "StackOnly1" << endl;}};
四、不能被继承
1、final
加上final关键字,表示该类不能被继承。
class NotInherit1 final
{};
2、构造函数私有化
由于派生类要调用父类的构造函数,所以将构造函数私有化。
class NotInherit2
{
private:NotInherit2(){}
};
五、单例模式
单例模式:一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
1、饿汉模式
优点:实现简单
缺点:可能导致进程启动慢;若两个单例有启动的先后顺序,则饿汉无法控制。
//饿汉模式:提前创建好实例对象
class SingleObj1
{
public:static SingleObj1* get(){return &so;}SingleObj1(const SingleObj1& s) = delete;SingleObj1& operator=(const SingleObj1& s) = delete;void print(){cout << "print" << endl;}private:SingleObj1(){}static SingleObj1 so; //声明
};//定义
SingleObj1 SingleObj1::so;
2、懒汉模式
第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控制。
//懒汉模式:第一次使用时创建
class SingleObj2
{
public:static SingleObj2* get(){if (so == nullptr){so = new SingleObj2;}return so;}SingleObj2(const SingleObj2& s) = delete;SingleObj2& operator=(const SingleObj2& s) = delete;void print(){cout << "print" << endl;}void Delete(){delete so;}class gc{public:~gc(){delete so;}};private:SingleObj2(){}~SingleObj2(){cout << "~SingleObj2" << endl;}static SingleObj2* so; //声明static SingleObj2::gc gg;
};SingleObj2* SingleObj2::so = nullptr;
SingleObj2::gc SingleObj2::gg;