特殊类设计[上]

news2024/11/16 19:31:20

文章目录

  • 1.只能在堆上创建对象的类
    • 1.1析构函数私有化
    • 1.2析构函数 = delete
    • 1.3构造函数私有定义+拷贝构造私有只声明
    • 1.4构造函数私有定义+拷贝构造 = delete
  • 2.不能被拷贝的类
    • 2.1 私有声明不定义拷贝构造函数
    • 2. 2拷贝构造函数 = delete
  • 3.只能在栈和静态区创建对象的类
  • 4.不能被继承的类
    • 4.1final关键字
    • 4.2基类构造函数私有化

1.只能在堆上创建对象的类

1.1析构函数私有化

class HeapOnly
{
public:
	void Destroy()
	{
		delete this;
	}
	/*void Destroy()
	{
		delete[] _ptr;
		operator delete(this);
	}*/

private:
	~HeapOnly()
	{
		cout << "~HeapOnly()" << endl;
	}

	int* _ptr;
};
int main()
{
	//HeapOnly ho1;
	//static HeapOnly ho2;

	HeapOnly* pho3 = new HeapOnly;
	pho3->Destroy();

	return 0;
}

1.2析构函数 = delete

class HeapOnly
{
public:
	HeapOnly()
	{
		_str = new char[10];
	}

	~HeapOnly() = delete;

	void Destroy()
	{
		delete[] _str;
		operator delete(this);
	}

private:
	char* _str;
};

int main()
{
	//堆上创建对象
	HeapOnly* ptr = new HeapOnly;
    ptr->Destroy();
    
	//栈上创建对象
	//HeapOnly hp1;
	//数据段上[静态区]创建对象
	//static HeapOnly hp2;
	return 0;
}

1.3构造函数私有定义+拷贝构造私有只声明

//构造函数私有化
class HeapOnly
{
public:
	//设置成静态成员函数的目的 在类外不需生成对象就可调用
	static HeapOnly* CreateObj(int x = 0)
	{
		HeapOnly* p = new HeapOnly(x);
		return p;
	}
private:
	//私有 只声明不实现
	//私有: 类外无法访问创建对象 
	//只声明: 压根就没想让别人用 声明毫无意义
	//不实现: 防止实现了在类内函数拷贝创建
	HeapOnly(int x = 0)
		:_x(x)
	{

	}
	HeapOnly(const HeapOnly& hp);
	HeapOnly& operator=(const HeapOnly& hp);
	int _x = 0;
};

int main()
{
	//HeapOnly ho1;
	//static HeapOnly ho2;
	//HeapOnly* pho3 = new HeapOnly;

	//静态成员函数才能这样访问
	HeapOnly* p1 = HeapOnly::CreateObj(1);
	
	//为防止拷贝构造在栈上创建对象 需要处理拷贝构造
	//HeapOnly p2(*p1);

	return 0;
}

1.4构造函数私有定义+拷贝构造 = delete

//构造函数私有化
class HeapOnly
{
public:
	//设置成静态成员函数的目的 在类外不需生成对象就可调用
	static HeapOnly* CreateObj(int x = 0)
	{
		HeapOnly* p = new HeapOnly(x);
		return p;
	}

	HeapOnly(const HeapOnly& hp) = delete;
	HeapOnly& operator=(const HeapOnly& hp) = delete;
private:
	//私有 只声明不实现
	//私有: 类外无法访问创建对象 
	//只声明: 压根就没想让别人用 声明毫无意义
	//不实现: 防止实现了在类内函数拷贝创建
	HeapOnly(int x = 0)
		:_x(x)
	{

	}
	int _x = 0;
};

int main()
{
	//HeapOnly ho1;
	//static HeapOnly ho2;
	//HeapOnly* pho3 = new HeapOnly;

	//静态成员函数才能这样访问
	HeapOnly* p1 = HeapOnly::CreateObj(1);
	
	//为防止拷贝构造在栈上创建对象 需要处理拷贝构造
	//HeapOnly p2(*p1);

	return 0;
}

2.不能被拷贝的类

上述已经讲述

2.1 私有声明不定义拷贝构造函数

2. 2拷贝构造函数 = delete

3.只能在栈和静态区创建对象的类

class StackOnly
{
public:
	static StackOnly CreateObj(int x = 0)
	{
		return StackOnly(x);
	}
private:
	StackOnly(int x = 0)
		:_x(x)
	{

	}
	int _x;
};

int main()
{
	/*
	StackOnly st1;
	static StackOnly st2;
	StackOnly* st3 = new StackOnly;
	*/

	StackOnly st1 = StackOnly::CreateObj(1);
	static StackOnly st2 = st1;
	return 0;
}

能不能只在栈上创建??? 禁用拷贝构造 启用移动构造

class StackOnly
{
public:
//不能传引用返回   因为StackOnly(x)是个局部对象
	static StackOnly CreateObj(int x = 0)
	{
		return StackOnly(x);
	}

	StackOnly(StackOnly&& st)
		:_x(st._x)
	{
	
	}

private:
	StackOnly(int x = 0)
		:_x(x)
	{
	
	}

	StackOnly(const StackOnly& st) = delete;

	int _x;
};

int main()
{
	/*
	StackOnly st1;
	static StackOnly st2;
	StackOnly* st3 = new StackOnly;
	*/

	StackOnly st1 = StackOnly::CreateObj(1);
	static StackOnly st2 = st1;
	//static StackOnly st2 = move(st1);

	return 0;
}

在这里插入图片描述

貌似可以 接着看

>

综上不可以!!!

4.不能被继承的类

4.1final关键字

在这里插入图片描述

4.2基类构造函数私有化

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Galaxy生信云|新增生存曲线绘制、肿瘤基因通路注释工具

2023-10-26&#xff0c;Galaxy生信云平台 UseGalaxy.cn 新增 2 个工具。 Cancer Research 生存曲线 Kaplan-Meier curve ploter肿瘤通路注释 Gene to oncogenic pathway mapper 部分结果展示 生存曲线 Kaplan-Meier curve ploter 生存曲线-不分层&#xff1a; 生存曲线-分层&am…

封装, 继承, 多态详解

面向对象编程有三大特征&#xff1a;封装、继承和多态 一.封装 思维导图概览&#xff1a; 1. 封装的概念 —— 把抽象出的数据&#xff08;属性&#xff09;和对数据的操作&#xff08;方法&#xff09;封装到一起&#xff0c;数据被保护在内部&#xff0c;程序的其它部分只有…

linux系统 too many open files解决方法

1.遇到的问题 too many open files是Linux系统中常见的错误&#xff0c;从字面意思上看就是说程序打开的文件数过多&#xff0c;不过这里的files不单是文件的意思&#xff0c;也包括打开的通讯链接(比如socket)&#xff0c;正在监听的端口等等&#xff0c;所以有时候也可以叫做…

Python 中的邻接矩阵

Python 中使用图数据结构来表示各种现实生活中的对象,例如网络和地图。 我们可以使用邻接矩阵来表示图。 本文将讨论在 Python 中实现邻接矩阵的不同方法。 创建邻接矩阵 考虑下图。 图中,有 6 个节点,编号为 1 到 6。图中连接节点的边有 7 条; 边 eij 连接节点 i 和节点…

2023年中国儿童滑板车优点、市场规模及发展前景分析[图]

儿童滑板车行业是指专门生产、销售和服务于儿童滑板车的行业。儿童滑板车是一种两轮滑行车&#xff0c;通常由车架、轮子、刹车和把手等部件组成。儿童滑板车是一种受欢迎的户外运动和娱乐工具&#xff0c;可以帮助儿童锻炼身体、提高平衡和协调能力&#xff0c;同时也是一种时…

无人机真机搭建问题记录文档(待续)

搭建问题 问题1 高飞课程中的飞控停产&#xff0c;更换飞控&#xff08;pixhawx 6c&#xff09;出现如下问题 1、飞控太大造成安装机载电脑的碳板上的孔被挡住。 2、课程提供的飞控固件&#xff0c;与更换的飞控不匹配 解决办法 1、现在的无人机碳板上只安装三个螺纹孔&…

如何平衡需求变更与项目进度冲突问题?

需求变更往往会对项目进度产生影响&#xff0c;可能会导致项目进度的重新评估、调整和重新开发已有功能&#xff0c;从而延长交付时间。如果忽视拒绝需求变更&#xff0c;会导致客户的不满和冲突。 因此如何更好地平衡两者间的冲突问题&#xff0c;迫在眉睫。一般来说&#xff…

【Unity ShaderGraph】| 制作一个 高级流体水球效果

前言 【Unity ShaderGraph】| 快速制作一个 流体水球效果一、效果展示二、简易流体水球效果三、进阶流体水球效果四、应用实例 前言 本文将使用ShaderGraph制作一个 高级流体水球 &#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xf…

8.MySQL内外连接

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 表的内连和外连 内连接 外连接 左外连接 右外连接 我们进行演示的表结构是这样的&#xff1a; 表的内连和外连 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的…

Vue3项目创建+组合式API使用+组件通信+渲染微博热搜+打包上线

摘要 Vue3的组合式API大大减少了代码量&#xff0c;以及使用也方便了很多&#xff0c;本案例使用Vite创建一个Vue3示例&#xff0c;简单介绍Vue3的组合式API使用以及父传子组件传参示例。 创建Vue3项目 1、首先要安装 Node.js 下载地址&#xff1a;https://nodejs.org/en/do…

css-物联网管理界面

效果图&#xff1a; 分享链接&#xff1a; monitor https://www.aliyundrive.com/s/CkLVqXcnJFc 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。

qt 双击可执行文件提示没有平台插件Qt platform plugin

准备打包可执行文件时&#xff0c;双击可执行文件 报错提示&#xff1a; 解决办法&#xff1a; 从qt安装目录下拷贝platforms文件夹&#xff0c;放在你要执行的可执行目录里。

App在哪里可以免费内测分发?

当ios开发者开发完成ios App后&#xff0c;往往要进入内测或公测阶段&#xff0c;需要进行分发&#xff0c;测试用户才能下载应用。 App分发平台是许多app开发类企业经常使用的平台&#xff0c;将主要开发的app上传到app分发平台上进行内测下载。很多开发者服务平台其实是提供…

SDRAM学习笔记(MT48LC16M16A2,w9812g6kh)

一、基本知识 SDRAM : 即同步动态随机存储器&#xff08;Synchronous Dynamic Random Access Memory&#xff09;, 同步是指其时钟频率与对应控制器&#xff08;CPU/FPGA&#xff09;的系统时钟频率相同&#xff0c;并且内部命令 的发送与数据传输都是以该时钟为基准&#xff…

Python中if __name__ == ‘__main__‘,__init__和self 的解析

一、 if __name__ __main__ if __name__ __main__的意思是&#xff1a; 当.py文件被直接运行时&#xff0c;if __name__ __main__之下的代码块将被运行&#xff1b; 当.py文件以模块形式被导入时&#xff0c;if __name__ __main__之下的代码块不被运行。 1.1、一个 xxx.p…

面试题复盘-2023/10/20

目录 笔试题面试题&#xff08;未完待续&#xff09; 笔试题 一.多选题 A:map的key是const,不可更改 B:STL中的快速排序比一般的快速排序速度更快&#xff0c;是因为中值排序法 C:list的插入效率是O(1) D:vector的容量只能增大不能减小 解析&#xff1a; B: STL中的sort函数的…

Python教程总结版

目录 1. chr()和ord()的用法 2. input()——读取数据的转换 2.1 int(),float(),list() 数据转换 2.2 split()函数处理多个输入值 2.3 map()强制转换 1. chr()和ord()的用法 for i in range(65, 91): print(chr(i), end) # 控制台输出&#xff1a;ABCDEFGHIJKLMNOPQRSTUV…

关于高并发你必须知道的几个概念

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 为与不为皆为可为&#x1f335; &#x1f349;本篇简介:&#x1f349; 本篇记录高并发必须知道的几个概念&#xff0c;如有出入还望指正。 关注公众…

墨西哥专线港口通航情况

随着全球贸易的不断发展&#xff0c;墨西哥作为拉美地区的重要国家&#xff0c;其港口通航状况对于国际贸易具有重要意义。本文将从墨西哥专线港口的通航现状、通航瓶颈以及未来发展趋势等方面进行分析&#xff0c;以期为墨西哥港口的发展提供一些参考。 一、墨西哥专线港口的通…

使用Linux JumpServer 堡垒机进行远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…