C++中的几个特殊类(在堆上,栈上创建对象)

1. 设计一个类只能在堆上创建对象。
  • 实现方式
    (1)将类的构造函数,拷贝构造函数设置为私有,防止别人调用,防止别人调用拷贝在栈上生成对象。
    (2)提供静态成员函数,在函数中完成堆对象的创建。

class Base
{
private:
	Base()
	{}
	Base(const Base&)
	{
	}
	Base(const Base& a) = delete;//C++11的做法;
public:
	static Base* fun()
	{
		return new Base;//在堆上创建
	}
};
2. 设计一个类 在栈上创建一个对象:

方法一

  • 将构造函数私有,静态成员函数创建对象返回
class Base
{
private:
	Base()
	{}
public:
	static Base& fun(const Base&)
	{
		return Base();
	}
};

方法二:

  • 重新定义new和delete的方法,进而屏蔽掉系统内部的new
class Base
{
public:
	Base()
	{}
private:
	void* operator new(size_t s)
	{}
	void operator delete(void* p)
	{}
};
3. 设计一个不能被拷贝的类:
  • 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可
//C++98:

class Base
{
private:
	Base(const Base&);
	Base& operator=(const Base&);
	//...
};
//C++11中的做法
class Base
{
	//...
	Base(const Base&) = delete;

	Base& operator=(const Base&) = delete;
	//...
};	

在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。

4. 设计的类不能被继承。

方法一:构造函数私有化,派生类无法让基类使用基类构造函数创建对象:
方法二:C++11,final关键字

// C++98中构造函数私有化,派生类中调不到基类的构造函数。则无法继承
class Inherit
{
public:
	static Inherit GetInstance()
	{
		return Inherit();
	}
private:
	Inherit()
	{}
};
//C++11做法
class Base final
{
	//...
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值