【C++】特殊类设计

文章目录

  • 一、请设计一个类,只能在堆上创建对象
  • 二、请设计一个类,只能在栈上创建对象
  • 三、请设计一个类,不能被拷贝
  • 四、请设计一个类,不能被继承

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

实现方式

  • 将类的构造函数私有,并禁用拷贝构造函数(目的是防止别人调用拷贝在栈上生成对象)
  • 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

代码示例

class HeapOnly
{
public:
	static HeapOnly* GreateObject()
	{
		return new HeapOnly();
	}

private:
	HeapOnly() {};
	HeapOnly(const HeapOnly&) = delete;
};

int main()
{
	// 成功,通过静态方法在堆上创建并返回对象
	HeapOnly* p1 = HeapOnly::GreateObject();
	// 失败,试图通过拷贝构造在栈上创建对象
	HeapOnly p2(*p1);
	return 0;
}

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

实现方式:屏蔽new
 因为 new 在底层调用void* operator new(size_t size)函数,只需将该函数屏蔽掉即可。

代码示例

class StackOnly
{
private:
	// 因为 new 和 delete 是搭配使用的
	// 所以我们要禁的话就把两个都给禁了
	void* operator new(size_t size) = delete;
	void operator delete(void*) = delete;
};

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

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

代码示例

class CopyBan
{
public:
	// 一旦显示声明了拷贝构造,则编译器生成的默认构造函数就不存在了
	// 反之则不会
	CopyBan() {};
	
private:
	CopyBan(const CopyBan&) = delete;
	CopyBan& operator=(const CopyBan&) = delete;
};

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

C++98方式:将基类的构造函数私有化,这样派生类中就调不到基类的构造函数,也就无法继承。

class InheritBan
{
public:
	// 通过静态方法返回在栈上创建的基类对象
	static InheritBan GreateObjectOnStack()
	{
		return InheritBan();
	}
	// 通过静态方法返回在堆上创建的基类对象
	static InheritBan* GreateObjectOnHeap()
	{
		return new InheritBan();
	}

private:
	// 构造函数私有,则派生类无法调用,也就实现不了继承
	InheritBan() {};
};

C++11方式:通过 final 关键字修饰基类,表示该类不能被继承。

class A final
{
 // ....
};

你可能感兴趣的:(C++,c++)