IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++进阶】特殊类设计 -> 正文阅读

[C++知识库]【C++进阶】特殊类设计

目录

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

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

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

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

饿汉模式

懒汉模式

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

第一种(不推荐):

class OnlyHeap
{
public:
	void DestoryObj()
	{
		delete this;
	}
private:
	~OnlyHeap()
	{
		cout << "~OnlyHeap()" << endl;
	}
private:
	int _a;
};
int main()
{
	OnlyHeap* ptr = new OnlyHeap;
	ptr->DestoryObj();
	return 0;
}

第二种(推荐):?

class OnlyHeap
{
public:
	//2.提供一个静态的公有函数创建对象,对象创建的都在堆上
	static OnlyHeap* CreateObj()
	{
		return new OnlyHeap;
	}
private:
	//1.构造函数私有化
	OnlyHeap()
		:_a(0)
	{}
private:
	int _a;
	//C++98   防拷贝------只声明,不实现,声明为私有
	OnlyHeap(const OnlyHeap& oh);
};
int main()
{
	//static突破类域
	OnlyHeap* ptr = OnlyHeap::CreateObj();
	OnlyHeap copy(*ptr);//报错
	delete ptr;
	return 0;
}

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

第一种:

class StackOnly
{
public:
	static StackOnly CreateObj()
	{
		return StackOnly();
	}

private:
	StackOnly()
		:_a(0)
	{}
private:
	int _a;
};
int main()
{
	StackOnly so = StackOnly::CreateObj();

	return 0;
}

第二种:?

class StackOnly
{
public:
	StackOnly()
		:_a(0)
	{}
private:
	//重载一个类专属operator new
	//C++98 防调用---只声明,不实现,声明为私有
	void* operator new(size_t size);
	void operator delete(void* ptr);

	//C++11
	void* operator new(size_t size) = delete;
	void operator delete(void* ptr) = delete;
private:
	int _a;
};
int main()
{
	StackOnly so;
	StackOnly* ptr = new StackOnly;//报错
	//这种方式存在一些漏洞,无法禁止在静态区创建对象
	static StackOnly sso;
	return 0;
}

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

class NonInherit
{
public:
	static NonInherit GetInstance()
	{
		return NonInherit();
	}
private:
	NonInherit()
	{}
};
//C++98这种方式不够直接
//这里是可以继承的,但是Derive不能创建对象,因为Derive的构造函数
//必须调用父类NonInherit构造,但是NonInherit的构造函数私有了
//私有在子类中不可见,这里的继承不会报错,而继承的子类创建对象会报错
class Derive :NonInherit
{};
int main()
{
	return 0;
}

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

饿汉模式

?缺陷:单例对象时main函数之前创建初始化的

1,如果单例对象的构造函数中要做很多工作,可能会导致程序启动慢

2,如果多个单例类,并且他们之间有依赖关系,那么饿汉模式无法保证

懒汉模式

第一个调用GetInstance时,才会创建初始化单例对象

相对于饿汉,不存在可能会导致启动慢的问题,并且可以控制顺序依赖问题

?双检查加锁:

Singleton* Singleton::_sinst;//定义
mutex Singleton::_mtx;

Singleton& Singleton::GetInstance()
{
	//双检查加锁
	if (_sinst == nullptr)
	{
		_mtx.lock();
		if (_sinst == nullptr)
		{
			_sinst = new Singleton;
		}
		_mtx.unlock();
	}
	return *_sinst;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:25:04  更:2022-08-06 10:28:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/26 22:49:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码