C++特殊类

2023-03-30 14:53:24 浏览数 (1)

目录

1请设计一个类,不能被拷贝

2请设计一个类,只能在堆上创建对象

3请设计一个类,只能在栈上创建对象

4请设计一个类,不能被继承

5请设计一个类,只能创建一个对象(单例模式)


1.请设计一个类,不能被拷贝

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。

在C 98中,将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。

代码语言:javascript复制
//C  98
class CopyBan
{
	//...
private:
	CopyBan(const CopyBan&);
	CopyBan& operator=(const CopyBan&);
	//...
};

①设置成私有之后,如果只声明没有设置成private,用户自己如果在类外定义了,就可以不能禁止拷贝了。

②只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单,而且如果定义了就不会防止成员函数内部拷贝了。

在C 11中,C 11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。

代码语言:javascript复制
//C  11
class CopyBan
{
	//...
	CopyBan(const CopyBan&) = delete;
	CopyBan& operator=(const CopyBan&) = delete;
	//...
};

2.请设计一个类,只能在堆上创建对象

实现方法:

只能在堆上创建对象,意味着我们需要禁止产生栈对象,只能在堆上创建对象。由于在栈上的对象会自动析构,因此把析构函数私有化。

同时将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。

最后提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。

代码语言:javascript复制
//只能在堆上创建对象的类
class HeapOnly
{
public:
	//通过静态成员函数,在堆上完成对象的创建
	static HeapOnly* CreateObj()
	{
		return new HeapOnly;
	}

	void Destory()
	{
		this->~HeapOnly();
	}
private:
	~HeapOnly()
	{}

	//将构造函数和拷贝构造私有
	HeapOnly()
	{}

	HeapOnly(const HeapOnly&) = delete;
};

int main()
{
	//创建失败,因为构造函数HeapOnly()私有了
	// //这个对象除了会调用构造函数,还会调用析构函数
	//HeapOnly hp1;
	//HeapOnly* php2 = new HeapOnly;
	//static HeapOnly hp3;

	//通过调用静态成员函数,创建堆上的对象
	HeapOnly* php4 = HeapOnly::CreateObj();

	//拷贝失败,因为拷贝构造函数HeapOnly(const HeapOnly&)被删除了
	//HeapOnly hp5(*php4);
	//delete php4;
	php4->Destory();
	return 0;
}

3.请设计一个类,只能在栈上创建对象

产生堆对象的唯一方法是new出来,我们只需把new的重载和delete重载给禁止掉了

0 人点赞