🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:设计特殊类;不能被拷贝的类;只能在堆上创建对象的类;只能在栈上创建对象的类;不能被继承的类
⬆⬆⬆⬆上一篇:C++智能指针
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
1.设计一个类,不能被拷贝
对于不能拷贝,那就是不能使用拷贝构造和赋值即可
#include <iostream>
using namespace std;
//不能拷贝
class ProhibitCopy
{
public:
ProhibitCopy()
{}
private:
ProhibitCopy(const ProhibitCopy& c);
ProhibitCopy& operator=(const ProhibitCopy& c);
};
int main()
{
ProhibitCopy p1;
//ProhibitCopy p2= p1;
ProhibitCopy p3;
//p3 = p1;
return 0;
}
上述代码也很好理解,分别是把移动构造和赋值重载放进了private,只需要声明即可,这样就当代码中需要用到拷贝构造时就会编译报错,上面的写法是C++11之前的,当有了C++11就更方便了,见下面代码
#include <iostream>
using namespace std;
//不能拷贝
class ProhibitCopy
{
public:
ProhibitCopy()
{}
ProhibitCopy(const ProhibitCopy& c) = delete;
ProhibitCopy& operator=(const ProhibitCopy& c)=delete;
};
int main()
{
ProhibitCopy p1;
//ProhibitCopy p2= p1;
ProhibitCopy p3;
//p3 = p1;
return 0;
}
在C++11中引入了delete和default,因此在这里可以直接用关键字来解决,不再需要放在private中
2.请设计一个类,只能在堆上创建对象
#include <iostream>
using namespace std;
//只能在堆上创建对象
class OnlyHeap
{
public:
static OnlyHeap* CreateObject()
{
return new OnlyHeap;
}
private:
OnlyHeap()
{}
OnlyHeap(const OnlyHeap&) = delete;
OnlyHeap& operator=(const OnlyHeap&) = delete;
};
int main()
{
OnlyHeap* ptr=OnlyHeap::CreateObject();
delete ptr;
//OnlyHeap obj;
return 0;
}
上面的代码展示了如果只能在堆上创建对象,首先我们需要把构造函数放private下,同时对于拷贝构造和赋值重载用delete关键字修饰,保证不会通过拷贝来创建出对象,同时我们使用一个static的函数来创建并返回new出来在堆上开辟出来的对象,使用static是必须的,因为没有对象就不能调用成员函数,只有使用static函数
3.请设计一个类,只能在栈上创建对象
#include <iostream>
using namespace std;
//只能在栈上创建对象
class OnlyStack
{
public:
static OnlyStack CreateObject()
{
return OnlyStack();
}
// 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉
void* operator new(size_t) = delete;
void operator delete(void*) = delete;
//private:
OnlyStack()
{ }
};
int main()
{
OnlyStack st=OnlyStack::CreateObject();
//OnlyStack* ptr1 = new OnlyStack;
//OnlyStack* ptr2= new OnlyStack(st);
return 0;
}
对于只能在栈上创建对象其实和前一个差不多,但是要注意一下其中用delete修饰的operator new和operator delete,这两个是针对于new对象时调用拷贝构造,但是其实如果把operator new和operator delete禁掉后,不用把构造函数进行private了,这样做是为了保险
4.请设计一个类,不能被继承
#include <iostream>
using namespace std;
class Base
{
private:
Base()
{
}
};
class Derive :public Base
{
};
int main()
{
//Derive d;
return 0;
}
这个就很简单了,对于继承后的派生类,需要使用基类的构造函数,那我们把构造函数隐藏起来就可以了
还有一种写法如下,是C++11的写法
#include <iostream>
using namespace std;
class Base final
{
Base()
{
}
};
class Derive :public Base
{
};
int main()
{
Derive d;
return 0;
}
使用C++11的关键字final来修饰就可以了,况且这样也不会影响基类构造函数的使用
🌸🌸特殊类的设计的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪