06C++运算符重载

Synthesia技术浅析(四):自然语言处理 Synthesia 的自然语言处理(NLP)模块是其核心技术之一,涵盖了文本转语音(TTS)、情感分析以及多语言支持等多个方面。 阅读详情

C++运算符重载

什么是运算符重载

赋予运算符具有操作自定义类型数据功能

运算符重载的实质是什么?
	运算符重载的实质本身就是函数调用
运算符重载函数的写法
	函数返回值   函数名(函数参数)
函数返回值 :运算完成后的值决定的				Complex
函数名  : operator 加上重载运算符组成函数名  operator+ 
参数     :看运算符的操作数,具体参数个数是要看你重载函数形式是什么
函数体    : 写运算符具体想要的操作

友元函数重载运算符

类成员函数重载运算符

<< 运算符重载就是在 成员函数或者友元函数 中实现 你想在外面对 类对象实现的操作。

#include <iostream>
using namespace std;
class overload
{
public:
	// 构造函数
	overload(int a = 0, int b = 0) :a(a), b(b) {}
	void print()
	{
		cout << a <<" " << b << endl;
	}
	friend overload  operator+ (overload one, overload two);
	  //类成员函数重载,参数个数等于操作减一
	bool operator> (overload  object)
	{
		if (this->a > object.a)
		{
			return true;
		}
		else if (this->a == object.a && this->b > object.b)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
protected:
	int a;
	int b;
};
//友元重载: 参数个数就是操作数据
overload  operator+ (overload one, overload two)
{  
	//  在函数中实现    对象的成员相加
	return overload(one.a + two.a, one.b + two.b);
}

int main()
{
	overload one(3, 3);
	overload two(2, 7);
	overload three;
	three = one + two;    //overload  重载函数的隐式调用
	three.print();   //  3+2     3+7
	//显式调用
	overload result;
	result = operator+(one+one, two+one);//  3+3  3+3, 3+2     3+7
	result.print();               // 6+5,4+10
	if (one > two)	//one > two  是bool
	{
		cout << "one 比较大" << endl;
	}
	//对象可以表示一个数据,所以参数应该少一个
	if (one.operator>(two))
	{
		cout << "one比较大" << endl;
	}
	return 0;
}

在这里插入图片描述

特殊运算符重载

  • 流运算符重载
    • cin类型 : istream类的对象
    • cout类型:ostream类的对象
    • 流运算符 >> <<
必须采用友元函数形式重载
  • 他运算符
  • = () -> [] 只能采用类的成员函数形式重载
  • 流重载采用友元方式
    +. .* ?: :: 不能重载
#include <iostream>
#include <string>
using namespace std;
class Boy
{
public:
	// constraction fun
	Boy(string name = "", int age = 18) :name(name), age(age) {}
	friend istream& operator>>(istream& in, Boy& mm);
	friend ostream& operator<<(ostream& out, Boy& mm);
protected:
	string name;
	int age;
};

istream& operator>>(istream& in, Boy& mm)
{
	in >> mm.name >> mm.age;
	return in;
}
ostream& operator<<(ostream& out, Boy& mm)
{
	out << mm.name << "\t" << mm.age << endl;
	return out;
}

int main()
{
	string str;
	cout << "inter a string:";
	cin >> str;
	cout << str << endl;
	Boy bb;  //  创建对象
	// 对对象直接输入 输出
	cout << "inter a person name and age:";
	cin >> bb;   	//void  operator>>(istream& in,Boy& bb)
	cout <<bb;		//void  operator<<(ostream& out,Boy& bb)
	cout << "inter a string and a name age:";
	cin >> str >> bb;
	cout << str << endl << bb;
	return 0;
}

在这里插入图片描述

+ ++ --运算符重载

  • 问题: 前置和后置怎么区分?
  • 解决办法:
    ++ 增加无用参数 int去表示当前运算符重载是后置操作
#include <iostream>
#include <string>
using namespace std;
class Frend
{
public:
	Frend(string name, int age) :name(name), age(age) {}
	friend ostream& operator<<(ostream& out, Frend& object)
	{
		out << object.name << "\t" << object.age << endl;
		return out;
	}
	Frend operator++(int)	//需要一个无用参数 充当标记
	{
		int num = age;
		age++;
		return Frend(name, num);
		//上面三行等效下面一行
		//return MM(name,age++);
	}
	Frend operator++()
	{
		return Frend(name, ++age);
	}
	//类的对象的隐式转换  operator
	operator int()
	{
		return age;
	}
protected:
	string name;
	int age;
};
int main()
{
	Frend fr("威少", 19);
	cout << fr << endl;
	int num = 1;
	int result = num++;   //result=1  num=2
	cout << result << "\t" << num << endl;
	result = ++num;       //result=3  num=3
	cout << result << "\t" << num << endl;
	//   object 由 fr 来初始化
	Frend  object = fr++;
	cout << "Frend  object = fr++;" << object << fr;   //age=18  fr: 19
	object = ++fr;        //age:20   fr: 20
	cout <<"object = ++fr;"<< object << fr;
	//this_thread::sleep_for(3s);
	cout << "3s结束" << endl;
	Frend  boy("weishao", 20);
	int boyAge = boy;	//类的对象的隐式转换  operator
	cout << boyAge << endl;

	return 0;
}

在这里插入图片描述

  • 文本重载 (新标准中的,稍微落后一点开发工具不适用)
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
using namespace std;
//文本重载
unsigned long long  operator"" _h(unsigned long long num)
{
	return 60 * 60 * num;
}
unsigned long long  operator"" _min(unsigned long long num)
{
	return 60 * num;
}
int main()
{
	//this_thread::sleep_for(7s);
	cout << "7s结束" << endl;

	int second = 1_h;
	cout << "小时数:1";
	cout << second << "s" << endl;
	cout << "1_h + 18_min + 30=";
	int sum = 1_h + 18_min + 30;
	cout << sum << "s" << endl;
	return 0;
}

在这里插入图片描述

重载实战: 封装一个Array类,实现定长数组的操作
#include <iostream>
using namespace std;
class Array
{
public:
	Array() {}
	Array(int arraySize) 
	{
		this->arraySize = arraySize;
		memory = new int[arraySize];
	}
	int& operator[](int index) 
	{
		return memory[index];
	}
	int size() 
	{
		return arraySize;
	}
	friend ostream& operator<<(ostream& out, Array& object) 
	{
		for (int i = 0; i < object.size(); i++) 
		{
			out << object.memory[i] << " ";
		}
		out << endl;
		return out;
	}
	friend istream& operator>>(istream& in, Array& object) 
	{
		for (int i = 0; i < object.size(); i++)
		{
			in >> object.memory[i];
		}
		return  in;
	}
	Array& operator+(Array& object) 
	{
		Array* temp=new Array(this->size() + object.size());
		int count = 0;
		for (int i = 0; i < this->size(); i++) 
		{
			temp->memory[count++] = this->memory[i];
		}
		for (int i = 0; i < object.size(); i++) 
		{
			temp->memory[count++] = object.memory[i];
		}
		return *temp;
	}

	Array(Array& object) 
	{
		this->arraySize = object.arraySize;
		this->memory = new int[this->arraySize];
		for (int i = 0; i < object.size(); i++) 
		{
			this->memory[i] = object.memory[i];
		}
	}
	void operator=(Array& object) 
	{
		this->arraySize = object.arraySize;
		this->memory = new int[this->arraySize];
		for (int i = 0; i < object.size(); i++)
		{
			this->memory[i] = object.memory[i];
		}
	}
	~Array()
	{
		delete[] memory;
	}
protected:
	int arraySize;
	int* memory; //memory[i]
};

int main() 
{
	//以下测试代码要能够成功运行
	Array array(4);
	for (int i = 0; i < array.size(); i++)
	{
		cin >> array[i];   //array[i] 最终返回一个memory[i]
	}
	for (int i = 0; i < array.size(); i++)
	{
		cout << array[i];	////array[i] 最终返回一个memory[i]
	}
	cout << endl;
	//实现数组的连接
	Array one(3);   //输入1 2 3 
	cin >> one;
	Array two(4);   //输入2 3 4 5
	cin >> two;
	Array sum = one+two;
	cout << sum ;  //打印1 2 3 2 3 4
	Array num;
	num = sum;
	cout << num ;
	return 0;
}

在这里插入图片描述

Vue3 - Element Plus上传组件el-upload上传多个文件时,让on-change监听事件仅执行一次并获取最终文件列表方法(开启多选文件并手动上传,拿到文件列表统一循环调用接口上传) vue3,elementplus,Upload上传,el-upload,文件上传组件,上传组件on-change里执行多次,取消自动上传后change重复执行问题,upload上传多个文件后导致on-change执行多次拿不到最终文件列表,Element-plus的upload组件on-change不断执行怎么办,上传多个文件多次执行调用,上传多个文件时如何只执行一次on-change方法拿到最终的文件列表,vue3elementplus上传组件开启多个上传后导致change方法执行好几次,仅调用一 阅读详情

相关推荐

usb设备的定位信息获取

一个usb hub有20个口,每个口有一个标号,那么如果一个为X的标号插入了一个android设备,如何通过函数,得到这个X,代码实现如下,获取了location, 得到类似 Port_#0002.Hub_#0003 的字符串,然后,要对应一个表。

babytiger的专栏 2106

6.C++运算符重载

什么是运算符重载 赋予运算符具有操作自定义类型数据功能 运算符重载的实质本身就是函数调用 友元函数重载运算符 类成员函数重载运算符 特殊运算符重载 封装一个Array类,实现定长数组的操作 ...

LTSky19950509的博客 231

西门子PLC作为TCP客户端通信:TSEND_C/TRCV_C指令实战与状态机设计

在工业自动化与物联网系统中,TCP/IP通信是实现设备间数据交换的基础协议,其核心在于建立可靠的点对点连接与数据流传输。其工作原理基于客户端-服务器模型,通过三次握手建立连接,确保数据包的顺序与完整性。这项技术的工程价值在于打破了传统工控设备被动响应的局限,为实时数据主动上报、边缘计算集成提供了通用且灵活的解决方案。在工业物联网、设备远程监控、生产数据实时采集等场景中,TCP客户端模式使得PLC能够主动将产线状态、报警信息等关键数据推送至服务器或数据库,实现更及时的数据交互。本文聚焦于西门子S7-1200/

weixin_29194255的博客 361

C++标准语言day05

运算符函数、运算类的双目运算符、输入输出运算符、运算符的单目运算符、自变运算符函数、特殊的运算符函数、重载运算符的规则

weixin_61180910的博客 350

STM32H750实战:用TIM+DMA驱动ADC/DAC实现音频回环(附CubeMX配置避坑指南)

本文详细介绍了在STM32H750上构建高保真、低延迟音频链路的实战方法。通过配置TIM定时器作为硬件节拍器,精准触发ADC采集与DAC播放,并利用DMA实现数据的自动搬运,全程无需CPU干预。文章重点剖析了CubeMX配置中的关键步骤与常见“坑点”,如ADC的Conversion Data Management模式选择、DMA的FIFO与Burst模式配置,以及STM32H7系列必须开启ADC全局中断等,并提供了完整的代码实现与调试验证指南。

1057

R链式中介:如何一次性生成4个变量所有可能的链式中介结果?(含结果解读与粗略作图)#bruceR#ggplot2

一次性生成4个变量所能生成的24种链式中介并作图

weixin_64183017的博客 3236

C++运算符重载(操作符重载)

有时候我们需要让对象之间进行运算, C++ 提供的“运算符重载”机制,赋予运算符新的功能,就能解决用+将两个复数对象相加这样的问题。,因为左移运算符左边是cout,而想要调用类里的成员函数首先要是对象才行,而cout显然不是对象,括号运算符()也可以重载,对象名可以当成函数来使用(函数对象、仿函数)。除了 “ + ”,还有其他的运算符重载,如 “ - ”(减法运算)接着刚才的问题,我们利用运算符重载为运算符增加一些新的功能,,既可以接受const对象,也可以接受非const对象。

qq_41885018的博客 3906

【Niagara Vykon N4 】物联网学习 03照明控制及照明时间表

3.1 设计思路 3.2逻辑组件添加 ①依据原有控制照明逻辑,打开palette,找到schedule模块,添加BoolenSchedule。 ②打开kitContrl,找到Util,并添加BoolenSwitch。 ③剪切到原有的逻辑线,并进行逻辑连接,如下图。 ④新建BooleanWritable,命名为Switch,设置参数并进行逻辑连接,若下图。 3.3界面设计 ⑤至此完成了逻辑的设...

weixin_45217107的博客 2863

c++实现运算符的重载(解释最全)

基于c++实现对赋值运算符、算数运算符、左移运算符、下标运算符、new和delete、比较运算符的重载

qq_54413454的博客 1565

从零开始学习CANoe(三)—— 系统变量的创建和使用

从零开始学习CANoe(三)—— 系统变量的创建和使用

蚂蚁小兵 1万+

想在 Visual Studio Code 里进行 ABAP 开发,需要安装的扩展列表

安装完毕后,我们可以将 SAP 系统配置为 Visual Studio Code 连接的远程文件系统。为了连接到 SAP 系统,需要启用 ABAP 开发工具 (ADT) ICF 节点,这与 SAP Hana Studio 等工具使用的服务相同。打开 SAP GUI 并连接到目标系统,运行事务 SICF,然后激活 ADT_SRV 服务,如下所示。这启用了允许代码编辑器和 IDE 连接到 SAP 系统的服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3119

C++运算符重载详解

C++运算符重载详解

qq_52905520的博客 4万+

静态编译Qt5源码(Kylin-Desktop-V10-SP1-2203-LoongArch64+qt5.15.16)

之前的文档,记录的是通用情况,本次笔者记录下Qt5的静态编译过程,供有需要的小伙伴参考使用的操作系统是Kylin-Desktop-V10-SP1-General-Release-2203-LoongArch64,处理器是龙芯3A5000,架构是loongarch。

aggs1990的专栏 1401

【C++学习笔记】06_运算符重载

运算符重载,和函数重载一样,它允许我们在运算符的自然算法之外,自定义运算符的运算法则。如两个数组相加。 我们先来了解一下运算符重载的定义格式: (以+为例) 返回类型 operator+(参数列表); 如果我要定义数组相加的法则是两个整型长度相同数组对应下标元素分别相加,返回一个数组; 在这里插入代码片 ...

weixin_45794248的博客 218

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c++核心技术06(运算符重载)

c++核心技术06(运算符重载)

m0_58357544的博客 406

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++核心编程 day06 运算符重载、类的继承

关系运算符重载、函数调用运算符重载、字符串类封装、继承的基本语法、 继承方式、继承中的对象模型、继承中的构造与析构、 继承中的同名成员处理、 继承中的同名静态成员处理、多继承基本语法、菱形继承问题及解决

月仙儿的博客 213

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++笔记 06 (运算符重载)

对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。作用:实现两个自定义数据类型相加的运算 总结1: 对于内置的数据类型的表达式的运算符是不可能改变的 总结2:不能滥用运算符重载(例如operator+函数中写成减法)作用:可以输出自定义数据类型 总结:重载左移运算符配合友元可以实现输出自定义数据类型 总结:前置递增返回引用,后置递增返回值C++编译器至少给一个类添加4个函数 1)默认构造函数(无参,函数体为空) 2)默认析构函数(无参,函数体为空) 3)默认拷贝构造函数,对属性进行值拷

pangyushuang的博客 316

从零开始学C++06--运算符重载

对于内置的数据类型的表达式的运算符不可能改变不要滥用运算符重载前置递增返回引用,后置递增返回值实现图return 一个bool类型,在if中判断。

weixin_44025946的博客 173

C++习题06(03)Point3D运算符重载函数

题目描述 编程:定义描述三维坐标点的类Point3D,重载”++”、”–”、”+”运算符,要求用成员函数实现后置++运算符,用友元运算符实现前置–运算和加法运算符重载。 编写主函数,定义Point3D类对象p1、p2(p1、p2的值均从键盘输入)、p(使用默认值,默认值为0,0,0),执行 p = p1++; 输出p、p1的值 p = --p2; 输出p、p2的值 p = p1 + p2; ...

多学习 3359

# day-06 类和对象–C++运算符重载--函数调用运算符重载

类和对象–C++运算符重载 C++ 预定义的运算符,只能用于基本数据类型的运算,不能用于对象的运算 如何使运算符能用于对象之间的运算呢 函数调用运算符重载 函数调用运算符 () 的重载 由于重载后使用的方式非常像函数的调用,因此称为仿函数,仿函数在STL中用得比较多 自定义打印函数 #include <iostream> using namespace std; #include <string> class MyPrint{ public: void operator()(s

weixin_48245161的博客 142

【C++---06】实验报告: 运算符重载和虚函数

内容提要 对于类MyString,要求重载‘+’运算符后可以计算表达式:a=b+c;表示两个字符串连接。 其中a,b,c都是类MyString的对象。 使用虚函数编写程序求球体和圆柱体的体积及表面积。 由于球体和圆柱体都可以看作由圆继承而来, 所以可以定义圆类Circle作为基类。 在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。 由C...

白小鱼的博客 2476

C++学习-06-友元和运算符重载

wengmq的博客 203

C++_day06_运算符重载_智能指针

1.只有函数运算符可以带缺省函数,其他运算符函数主要由操作符个数确定 2.解引用运算符和指针运算符 示例代码: #include <iostream> using namespace std; class A{ public: A(int data = 0):m_data(data)  {    cout << "A构造" <<...

weixin_30332241的博客 203

C++系列06:类,封装,this指针,构造函数,析构函数,拷贝构造函数,运算符重载

内敛函数(内联 inline):在类内声明、同时在类内定义类外定义函数:在类内声明,在类外实现(标明域类名::函数名用 struct 或是 class 把某些属性和某些方法设计成私有或保护属性,我们才具有封装性。数据成员大多私有,外部无法直接初始化,C++ 提供构造函数:对象创建时系统自动调用、仅执行一次,专门初始化对象属性。Complex c1;// 正确:定义对象,调用无参构造// 正确:有参构造创建对象// 大坑!编译器识别为「函数声明」,不是对象// C++11列表初始化,无歧义。

2301_81587395的博客 359

学习笔记(06):C++语言基础视频教程-4.5 重载双目运算符

C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过...

GuangCZ的博客 183

LInux C++学习day06 拷贝构造和拷贝赋值 静态成员(static) 成员指针 操作符(运算符)重载

一 拷贝构造和拷贝赋值 1 浅拷贝和深拷贝 1)如果类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量本身,没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. 2)浅拷贝将导致不同对象间的数据共享,如果数据在堆区,析构时还可能会出现“double free”的错误,导致进程终止,所以必须自己定义一个支持复制指针所指向内容的拷贝构造函数,即深拷贝. 2 拷贝赋值 1)当两个对象进行赋值...

weixin_43789711的博客 255
上一篇: 删除链表中多个指定元素 借刀鲨人
下一篇: C++默认函数和类的组合07
燕子01
博客等级 码龄6年 8粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值