特殊类的设计

前言: 

        在C++中有很多关于类的知识,学习并且掌握它们是我们学习C++的重要的一步,怎么检测自己掌握了这些知识呢?请看看尝试解决下面这些问题。

目录

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

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

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

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

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


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

        拷贝只会发生在两个场景下,赋值和拷贝构造,因此想要一个类禁止拷贝,只需要让这个类不能调用拷贝构造和赋值运算符重载即可。 

        在C++98中:会采取拷贝构造函数,和operator=函数私有化的方法来解决这个问题。

         

using namespace std;
class CopyBan
{
public:
	CopyBan(int a = 0)
		:_a(a)
	{ }
	//...其它实现

private:
	CopyBan(const CopyBan&);
	CopyBan& operator=(const CopyBan&)
	{}
	int _a = 0;
};
int main()
{
	CopyBan cp;
	//拷贝和赋值都会报错
	CopyBan cp1(cp);
	CopyBan cp2;
	cp2 = cp;
	return 0;
}

        在C++11中采用关键字delete。 

        

class CopyBan
{
public:
	CopyBan(int a = 0)
		:_a(a)
	{ }
	//...其它实现
	//C++11采用delete关键字
	CopyBan(const CopyBan&) = delete;
	CopyBan& operator=(const CopyBan&) = delete;
	
private:
	
	int _a = 0;
};

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

        实现方式:

        1.将类的构造函数和拷贝构造函数私有化,防止别人调用它们在其它地方偷偷开辟空间。         

        2.提供一个静态的成员函数,该静态成员函数完成对象在堆上开辟空间的任务。

class HeapOnly
{
public:
	
	static HeapOnly* CreateObject()
	{
		return new HeapOnly;
	}
	HeapOnly(const HeapOnly&) = delete;
	HeapOnly& operator=(const HeapOnly&) = delete;
private:
	HeapOnly(int a = 10)
		:_a(a)
	{ }
	//int _a;
	int _a;
};

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

        思路:禁用掉拷贝构造,让构造函数私有化,使用静态方法创建对象返回即可。

class StackOnly
{
public:
	static StackOnly CreateObject(int a = 0)
	{
		return StackOnly();
	}
private:
	
	StackOnly(int a = 0)
		:_a(a)
	{}
	int _a;
};

        如果只是将operator new定义为已删除函数,不能解决这个问题,因为除了在堆上开辟空间以外,在静态区也是可以开辟对象的。 

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

        C++98的做法,构造函数私有化。

class NonInherit
{
	//子类继承父类要调用父类的构造函数,如果将构造函数声明为私有,则子类无法调用
public:
private:
	NonInherit(int a = 0)
		:_a(a)
	{ }
	int _a;
};

        C++11的做法,采用关键字finial ,final修饰类表示这个类不能被继承

class NonInherit
{
	
public:
    NonInherit(int a = 0)
		:_a(a)
	{ }
private:
	
	int _a;
};

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

        单例模式 

你可能感兴趣的:(javascript,开发语言,ecmascript)