特殊类的设计

🌟🌟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++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩情吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值