目录
一、设计一个类,不能被拷贝
二、设计一个类,只能在堆上创建对象
方案一、析构函数私有
方案二、构造函数私有
三、设计一个类,只能在栈上创建对象
四、设计一个类,不能被继承
一、设计一个类,不能被拷贝
拷贝在类中通常会发生在这两种场景 --- 拷贝构造 和 赋值重载。因此,想让一个类不能禁止拷贝,只需要让这个类不能调用拷贝构造函数和赋值运算符重载函数即可。
- c++98
将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。
class Copy
{//...
pirvate:Copy(const Copy& cp);Copy& operator=(const Copy& cp);
};
- c++11
C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上 =delete,表示让编译器删除掉该默认成员函数。
class Copy
{//...
pirvate:Copy(const Copy& cp) = delete;Copy& operator=(const Copy& cp) = delete;
};
二、设计一个类,只能在堆上创建对象
方案一、析构函数私有
class HeapOnly
{
public:void Destory(){delete this;}
private:~HeapOnly(){cout << "~HeapOnly()" << endl;}
};int main()
{HeapOnly* HPtr = new HeapOnly;HPtr->Destory();return 0;
}
方案二、构造函数私有
class HeapOnly
{
public:static HeapOnly* CreateObj(){return new HeapOnly;}HeapOnly(const HeapOnly& ho) = delete;//HeapOnly& operator=(const HeapOnly& ho) = delete;
private:HeapOnly(){std::cout << "HeapOnly()" << std::endl;}
};int main()
{HeapOnly* HPtr = HeapOnly::CreateObj();//HeapOnly copy(*HPtr);//HeapOnly copy = *HPtr;return 0;
}
三、设计一个类,只能在栈上创建对象
class StackOnly
{
public:static StackOnly CreateObj(){StackOnly obj;return obj;}//实现类专属的operator newvoid* operator new(size_t size) = delete;
private:StackOnly(){std::cout << "StackOnly()" << std::endl;}
};int main()
{StackOnly ptr = StackOnly::CreateObj();//StackOnly* ptr1 = new StackOnly(ptr);return 0;
}
四、设计一个类,不能被继承
- c++98,将构造函数私有
// C++98中构造函数私有化,派生类中调不到基类的构造函数。则无法继承
class NonInherit
{
public:static NonInherit GetInstance(){return NonInherit();}
private:NonInherit(){}
};
- c++11,新增关键字final
class A final
{// ....
};