06C++运算符重载

别再只玩积木了!用乐高EV3和官方软件,手把手教你做个能巡线的小车(附完整代码) 本文详细介绍了如何利用乐高EV3套件和官方软件制作智能巡线机器人,从硬件组装到软件编程全面覆盖。通过传感器原理讲解、控制算法调试等工程化细节,帮助读者掌握机器人开发的核心理念,特别适合STEAM教育和硬件编程爱好者实践。 阅读详情

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;
}

在这里插入图片描述

Android 14.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能 在14.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析实现这个功能 阅读详情

相关推荐

9 海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例

海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 7172

6.C++运算符重载

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

LTSky19950509的博客 231

双有源桥(DAB)进阶:EPS调制策略与Matlab/Simulink仿真实践

本文深入探讨了双有源桥(DAB)的扩展移相(EPS)调制策略及其在Matlab/Simulink中的仿真实践。通过分析EPS的两种黄金调制策略——回流功率消除和电流应力优化,结合实际工程案例,展示了如何提升DAB系统的效率和性能。文章还详细介绍了Simulink模型搭建要点和关键仿真结果,为工程师提供了实用的技术参考。

weixin_33734785的博客 483

C++标准语言day05

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

weixin_61180910的博客 350

AI大模型开发——transformer模型超全完整版(0基础可懂)

为了更深入的了解transformer模型,我们首先从transformer的诞生聊起吧。transformer在2017年由Vaswani等人首次提出,它摒弃了之前流行的循环神经网络和卷积神经网络的架构,引入了自注意力机制( Self-Attention),显著提高了处理序列数据的能力和效率。transformer模型的这种设计使其在处理长距离依赖问题时, 相比于传统的循环神经网络和长短期记忆网络(LSTM)表现得更加出色,至此, 开启了NLP技术的新篇章。

m0_74922316的博客 2120

【GlobalMapper精品教程】072:GlobalmapperV25中文版下载地址及安装教程

GlobalmapperV25中文版下载地址及安装教程安装包位于专栏完整数据包中,请订阅后从优快云私信查收!最新GlobalMapper中文版入门实战实验教程,图文并茂,实用性强,内容包括:GM基础操作、数据处理及地形图制作、航测内业数据处理、点云处理、地形分析、空间分析、数据库建库入库等。配套完整案例数据,持续同步更新!订阅专栏后,从私信查收中文安装包永久版(中文23.0+24.0)及配套实验数据包。

智慧空间实验室 4731

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

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

qq_41885018的博客 3906

C++ Qt6 QtQuick/QML入门进阶与项目实战视频教程

C++ Qt这些年在PC客户端、嵌入式、汽车座舱仪表等领域应用很广泛,例如剪映专业版、微信4.0、亿图脑图、Steam、美图秀秀、腾讯会议、钉钉(部分模块)等都是使用C++ QWidget/QML开发。特别是QML这种声明式UI开发更加快捷,QML的界面开发效率相对于QWidget更快速,界面效果更好,QtQuick/QML在Qt6版本也逐渐完善了,使用QML进行客户端开发是个不错的选择。

琅嬛福地 4487

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

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

qq_54413454的博客 1565

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 615

启动launch文件时显示找不到franka_ign_ros2_control-system...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 695

C++运算符重载详解

C++运算符重载详解

qq_52905520的博客 4万+

Allegro如何画Photoplot_Outline操作指导

在用Allegro进行PCB设计的时候,最后进行光绘输出前,Photoplot_Outline是必备一个图形,所有在Photoplot_Outline中的图形将被输出,Photoplot_Outline以外的图形都将不被输出。如何绘制Photoplot_Outline,具体操作如下。如何画Photoplot_Outline操作指导。

weixin_54787054的博客 2629

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

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

weixin_45794248的博客 218

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

m0_58357544的博客 406

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

月仙儿的博客 213

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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、付费专栏及课程。

余额充值