c++之说_9_6|自定义类型 struct operator 重载运算符关键字

c++中 struct  和 class  特性几乎一模一样

所以很多都是共有的特性 篇幅就很多了

c++中  我觉得最牛皮的概念之一 就是

重载运算符  operator 关键字

这个东西 能将  我们的  运算符 (+-*/) new  delete

 类型转换

写在类里面当成员函数 并制定 该类型变量运算时所适用的逻辑

以下是可重载的所有运算符:

e87c27d812124d0fb51764149ab5b02d.jpg

 这是重载运算符时的方式 注意  运算符替换掉 @

a3d662da964042a2b1ec2f1933d230df.jpg

 运算符 前缀后缀 放置位

ce19ef483ad8495285cb6213518a2bac.jpg

 限制 或 不可重载的符号

53b6a8863dcb4dc0bae42ebd328deed5.jpg


struct obj_3
{

	obj_3() {};
	obj_3(const int& Ina, const int& Inb) : a(Ina), b(Inb) {}


	int	geta()const { return a; };

	int	getb()const { return b; };


private:

	int a = 0;
	int b = 0;

};


struct obj_1
{

public:
	obj_1() { Ts = this;  };
	//使用了委托构造
	obj_1(const int& Ina, const int& Inb) : obj_1() { a = Ina; b = Inb; }


	int	geta() const { return a; };

	int	getb() const { return b; };
public:

	bool operator== (const obj_1& Target)
	{
		
		return  (this->a == Target.a) && (this->b == Target.b);
	};

	bool operator!= (const obj_1& Target)
	{

		return  !operator==(Target);
	};
	operator obj_3()
	{
		std::cout << __func__ << ":" << endl;
		return obj_3(99, 99);
	}

	void* operator new(std::size_t size, void* p, int io,char* c)
	{
		std::cout << "obj_1::" << __func__ << "(std::size_t size, void* p,char* c) :" << endl;
		std::cout << "operator new 构造的地址是:" << p << endl;
		std::cout << "operator new   io :" << io << endl;
		std::cout << "operator new   c :" << c << endl;
		return p;
	}

	void operator delete(void* p,size_t size, const char* c)
	{
		std::cout << "obj_1::" << __func__ << "(void* p,size_t size, const char* c) :" << endl;
		std::cout << "operator delete的地址是:" << p << endl;
		std::cout << "operator delete   size :" << size << endl;
		std::cout << "operator delete   c :" << c << endl;
		return;

	}


	int	operator[](int i)
	{
		std::cout << "obj_1::" << __func__ << "(int i) :" << endl;
		std::cout << "i = "<< i << endl;
		return a + i;
	}

	~obj_1() {};


private:

	obj_1* Ts;

	int a = 0;
	int b = 0;

};

struct obj_2
{

	obj_2() {};
	obj_2(const int& Ina, const int& Inb) : a(Ina), b(Inb) {}


	int	geta()const { return a; };

	int	getb()const { return b; };

	obj_2& operator= (const obj_1& Target)
	{

		std::cout << "obj_2::" << __func__ << "(const obj_1& Target) :" << endl;

		this->a = Target.geta();
		this->b = Target.getb();

		return *this;
	};

	operator obj_1()
	{

		std::cout << "obj_2::" << __func__ << ":" << endl;
		return	obj_1(this->a, 100);
	}


	~obj_2() {};


private:

	int a = 0;
	int b = 0;

};


int main()
{
	std::cout << __func__ <<":"<< endl;

	obj_1 a1(10, 1000);
	obj_2 b2(50, 10);
	obj_3 c3;
	obj_1 texta1;
	obj_2 textb2;


	std::cout << "初始化完各个对象的值" << endl;
	std::cout << "a1.a: "<<a1.geta() << endl;
	std::cout << "a1.b: " << a1.getb() << endl;
	std::cout << "b2.a: " << b2.geta() << endl;
	std::cout << "b2.b: " << b2.getb() << endl;
	std::cout << "c3.a: " << c3.geta() << endl;
	std::cout << "c3.b: " << c3.getb() << endl;
	std::cout << "texta1.a: " << texta1.geta() << endl;
	std::cout << "texta1.b: " << texta1.getb() << endl;
	std::cout << "textb2.a: " << textb2.geta() << endl;
	std::cout << "textb2.b: " << textb2.getb() << endl;

	textb2 =	a1;
	std::cout << "该操作完成时各个变量的值" << endl;
	std::cout << "a1.a: " << a1.geta() << endl;
	std::cout << "a1.b: " << a1.getb() << endl;
	
	std::cout << "textb2.a: " << textb2.geta() << endl;
	std::cout << "textb2.b: " << textb2.getb() << endl;
	
	texta1 = (obj_1)b2;
	std::cout << "该操作完成时各个变量的值" << endl;
	
	std::cout << "b2.a: " << b2.geta() << endl;
	std::cout << "b2.b: " << b2.getb() << endl;
	
	std::cout << "texta1.a: " << texta1.geta() << endl;
	std::cout << "texta1.b: " << texta1.getb() << endl;
	
	c3 = a1;
	std::cout << "该操作完成时各个变量的值" << endl;
	std::cout << "a1.a: " << a1.geta() << endl;
	std::cout << "a1.b: " << a1.getb() << endl;
	
	std::cout << "c3.a: " << c3.geta() << endl;
	std::cout << "c3.b: " << c3.getb() << endl;


	std::cout << "a1[100]: " << a1[100] << endl;


	static char b[10] = { 0 };
	char p = '2';

	obj_1* pobj1 = ::new obj_1;

	obj_1* pobjw = new(b, 9000,&p) obj_1;
	
	::delete pobj1;
	obj_1::operator delete( pobjw,60,&p);



	return  0;
}

部分测试代码我已放上

接下来我们运行看看

好 我们先看看第一处

textb2 =    a1;

textb2 是obj_2类型  a1 是obj_1类型

本来两个互不相同的自定义类型是无法使用 = 运算符的

但是此刻可以了 为何讷 

就因为运算符重载 operator

我们找到 obj_2 结构体是如何定义的

我们发现 有个 

obj_2& operator= (const obj_1& Target) 函数

其中有个输出函数 我们继续来看控制台

 obj_2::operator =(const obj_1& Target) :

证明  textb2 =    a1;

的确是运行了此函数

所以  obj_2& operator= (const obj_1& Target)

这个叫什么?

这个叫重载赋值符号

Target引用的值其实就是  a1

这是类中的写法

具体详细的大家去打断点试试

------------------------------------------------------------------------------

接下来看看这个

texta1 = (obj_1)b2;

texta1 是obj_1类型  b2 是obj_2类型

这语句一看 类型转换

但是细看  不对劲  不相关类型 如何支持转换

看了下控制台  输出了obj_2::operator struct obj_1:

我们去找找 obj_2里  输出的地方

operator obj_1()

这是什么?

这叫类型转换函数

obj_2 里面有个这个  证明了 有转换到 obj_1类型的方法

它返回了一个obj_1的临时对象  

我们看看a 和 b

  b2.a: 50
     b2.b: 10

  texta1.a: 50
     texta1.b: 100

构造的临时对象中的a使用了 b2.a , b使用了 100 

看了  没错是正确的

还是不太懂?

没事 继续看看 

    c3 = a1; 

 obj_3类型 c3    obj_1类型 a1;

这题一看 哎呦  我会 刚刚学过的  重载赋值运算符嘛!

一看输出  不对劲   operator struct obj_3:

怎么是类型转换函数呢?

去 obj_3类中看看

发现并没有operator 的函数

那就去obj_1类中看看

operator obj_3()

发现了obj_3 类型转换函数

所以这题运行的是类型转换函数

--------------------------------------------------------------------

接下来我们看

 a1[100]  

这个不是数组写法吗?

a1不是 obj_1类型的对象吗?

如何能当数组用  它又输出何物?

我们去看看obj_1类中怎么写的

我们发现了   int    operator[](int i)

看见了什么 operator 关键字  又是重载运算符

这次原来是重载数组运算符

返回的是 return a + i;

看了下 输出是 110 

之前a1.a 是多少?

-----------------------------------------------------------------

接下来我们来看看

void* operator new

重载 new 与 delete

直呼woc  c++ 还有什么运算符不能重载

void* operator new(std::size_t size, void* p, int io,char* c)

当然重载new 有一定的要求:

第一个形参必须是 size_t 类型的参数

看编译报错了

一般何时我们需要重载new呢?

要在指定的空间上进行创建对象时会进行重载

比如这里

我们看到了一个 
    obj_1* pobjw = new(b, 9000,&p) obj_1;

这写法很怪异

我们注意到了

b 是一个数组变量  证明是个地址

new(b, 9000,&p)  而语句是如此

我们去看看 重载位置 obj_1类中

看到了形参顺序 std::size_t size, void* p, int io,char* c

而调用是 new(b, 9000,&p) obj_1

有输出语句 我们去看看

我们发现 b= 00007FF6B74C0E90  io = 9000    c = ’2‘

顺序是按照  new(b, 9000,&p) obj_1

至于delete 要求是 第一个形参必须为  void *

浅谈结束

大家可以去该网站看看特性 语法规则

https://zh.cppreference.com/w/cpp/language/operators

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据-Spark-关于Json数据格式的数据的处理与练习

上一篇&#xff1a; 大数据-MapReduce-关于Json数据格式的数据的处理与练习-CSDN博客 16.7 Json在Spark中的引用 依旧利用上篇的数据去获取每部电影的平均分 {"mid":1,"rate":6,"uid":"u001","ts":15632433243} {"m…

linux系统查看占用cpu程序

目录 一&#xff1a;top 二&#xff1a; ps 三&#xff1a;perf 四&#xff1a;/proc/stat 五&#xff1a;pidstat 一&#xff1a;top 使用 top 命令&#xff1a;在终端中输入 top 命令&#xff0c;系统会显示当前正在运行的进程和它们的资源占用情况。默认情况下&#…

使用AKStream对接gb28181

优点&#xff1a;功能比较多&#xff0c;C#开发的&#xff0c;容易修改&#xff0c;内嵌入了zlmk流媒体服务品&#xff0c;启动简单 缺点&#xff1a;sip对摄像头兼容还有问题&#xff0c;大华接入非常不稳定&#xff0c;注册等待时间久&#xff0c;对海康是正常&#xff0c;占…

Oracle 的闪回技术是什么

什么是闪回 Oracle 数据库闪回技术是一组独特而丰富的数据恢复解决方案&#xff0c;能够有选择性地高效撤销一个错误的影响&#xff0c;从人为错误中恢复。闪回是一种数据恢复技术&#xff0c;它使得数据库可以回到过去的某个状态&#xff0c;可以满足用户的逻辑错误的快速恢复…

LabVIEW电液伺服控制系统

介绍了如何利用ARM微处理器和LabVIEW软件开发一个高效、精准的电液伺服控制系统。通过结合这两种技术&#xff0c;我们能够提高系统的数字化程度、集成化水平&#xff0c;以及控制精度&#xff0c;从而应对传统电液伺服控制器面临的问题。 该电液伺服控制系统由多个关键部分组…

TypeScript(八) number和string

1. TypeScript number 1.1. 描述 Number对象是原始数值的包装对象。 1.2.语法 var num new Number(value);;注意&#xff1a;如果一个参数值不能转换为一个数字&#xff0c;将返回NaN&#xff08;非数字值&#xff09;。 1.3. 对象属性 属性描述MAX_VALUE可表示的最大的数…

Postman-接口测试教程

接口是软件开发中常用的概念&#xff0c;是软件生产过程中比较核心的任务。对于接口开发者&#xff0c;调试接口是一件较为繁琐的事情&#xff0c;很多时候需要线上线下来回切换。在这里&#xff0c;我就跟大家介绍一个只需要在本地就可以调试接口的方法&#xff0c;即使用post…

Dubbo 3.x源码(17)—Dubbo服务发布导出源码(6)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(16)—Dubbo服务发布导出源码(5)&#xff0c;也就是Dubbo远程服务在导出远程服务得到Exporter之后&#xff0c;继续通过Registry将其注册到远程注册中心的源码。 实际上&#x…

git的分支操作

目录 简介&#xff1a; 操作&#xff1a;查看 操作&#xff1a;创建 操作&#xff1a;切换​编辑 操作&#xff1a;本地分支推送到远程 操作&#xff1a;git merge [name]合并分支​编辑 简介&#xff1a; 在Git中&#xff0c;可以通过分支来管理和处理不同的版本和功能。分…

DSP系统时钟总结

一、stm32中断偏移向量介绍 1.1 为什么要设置中断向量偏移 上图可以看出程序上电先进入0x08000000开始运行&#xff0c;紧接着执行复位中断向量&#xff0c;然后执行复位中断程序&#xff0c;然后进入main函数。 如果想要app的中断正常运行&#xff0c;那就必须手动设置中断向…

在本地电脑上打开服务器里面的localhost网址

远程连接服务器&#xff0c;启动了一个服务 显示访问地址为&#xff1a;http://127.0.0.1:7860 在本地浏览器将127.0.0.1改成服务器ip但是无法访问 解决办法&#xff1a; 1. ssh新建一个远程连接&#xff0c;将服务器的7860端口重定向到本机 ssh -L 18097:127.0.0.1:7860 us…

LeetCode 54 螺旋矩阵

题目描述 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#x…

qt-C++笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别

qt-C笔记之QStringList、QList、QString、QChar、QList区别 —— 杭州 2024-01-30 凌晨0:27 参考博文&#xff1a;qt-C笔记之QStringList code review! 文章目录 qt-C笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别1.Qt的字符容器类1.QSt…

PHP抽奖设置中奖率,以及防高并发

一、中奖率,先在后台设定好奖项名称,抽奖份数,以及中奖百分比 奖品表draw 二、 借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙" 阻塞(等待)模式,一般都是用这个模…

五大架构之一:系统架构数据流风格

系统架构数据流风格详细介绍 系统架构数据流风格是一种软件体系结构风格&#xff0c;它强调了系统内部不同部分之间的数据流动。这种风格侧重于描述系统中的数据处理过程&#xff0c;以及数据是如何从一个组件传递到另一个组件的。以下是系统架构数据流风格的详细介绍&#xff…

-1- Python环境安装

1、Python安装 1、Windows安装Python 进入python官网&#xff1a;Welcome to Python.org点击 download——>all releases&#xff1b;建议选择3.7.2版本&#xff08;网页链接&#xff1a;Python Release Python 3.7.2 | Python.org&#xff09;&#xff1b;下拉&#xff0…

云原生数据库GaiaDB的核心技术演进

导读 越来越强调云原生的环境下&#xff0c;存算分离作为一种新的架构理念&#xff0c;已经是大势所趋。新的技术架构带来新的问题和挑战&#xff0c;GaiaDB 在自研过程中采用Quorum分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性。 本文针对一系列…

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…

element -table,多行或列合并

需求&#xff1a;后端返回的表格数据&#xff0c;如果某列值一样&#xff0c;前端表格样式需要合并他们&#xff0c;需要合并的列的行数未知&#xff08;所以需要有数据后遍历后端数据对需要合并的属性进行计数&#xff09;即动态遍历表格合并 效果 - 重点方法&#xff1b;ta…

《金融电子化》昆仑银行在应用性能监控(APM)平台的实践与探索

《金融电子化》昆仑银行在应用性能监控&#xff08;APM&#xff09;平台的实践与探索 中国人民银行印发的《金融科技发展规划&#xff08;2022-2025年&#xff09;》是对金融科技发展的重要引领。规划强调了金融科技在推动金融行业现代化转型、提升金融服务效率和风险防控水平…