💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
前言
今天我们讲解特殊类的设计,再我们的开发中难免会出现一些特殊情况,也是设计出一些特殊的类,他们和普通类不同担忧很相似,接下来博主会带大家设计出五种特殊的类,话不多说,我们开始进入正文的讲解。
一、请设计一个类,不能被拷贝
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,
只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
C++98的使用方法:
class A
{
private:
A(const A& a){
}
A& operator=(const A& a){
}
};
C++11的用法:
class A
{
public:
A(const A& a)=delete;
A& operator=(const A& a)=delete;
private:
};
C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上
=delete,表示让编译器删除掉该默认成员函数。不拷贝再下面几个场景都需要使用到,防拷贝的用法
二、请设计一个类,只能在堆上创建对象
第一种方式:
class heaponly
{
public:
private:
~heaponly(){
}
};
int main()
{
heaponly p0;//这样会报错
heaponly* p2 = new heaponly;
return 0;
}
原因是p2可以手动进行释放,但是需要再类中写一个接口来进行释放:
第二种方式:
class heaponly
{
public:
static heaponly* creakobj()
{
return new heaponly;
}
private:
//1.先将构造函数私有化
heaponly(){
}
//3.防拷贝
heaponly(const heaponly& h) = delete;
heaponly& operator=(const heaponly& h) = delete;
};
将构造函数私有化,都创建不了对象
所以写一个接口,通过调用接口来实现创建对象。但是调用函数需要,这时候就是先有鸡还是先有蛋的问题,所以我们将接口设计成静态的。
解决了再堆上创建对象的问题,但是又有可能通过构造和赋值,再栈上创建对象,所以需要防拷贝
这样就解决问题了。
三、 请设计一个类,只能在栈上创建对象
这个设计理念和上面哪个很相似
我们需要将构造函数私有化,这样才能保证都创建不了对象,然后提供一个接口。
class stackonly
{
public: