C++ 复习 之 运算符重载!

复习笔记(六)——C++运算符重载(难点) 目录运算符重载运算符重载的概念运算符重载的定义实例运算符重载的规则一元运算符重载实例自增、自减运算符重载实例二元运算符重载赋值运算符的重载实例‘+’运算符重载的使用实例重载运算符‘[ ]’实例 运算符重载 运算符重载的概念 运算符重载类似于函数重载。 运算符重载允许把标准运算符(如+、-、*、<等)应用于定制数据类型的对象。 什么情况下需要考虑运算符重载? 需要用运算符操作自定义类的对象时,如对象之间直观自然,可以提高比较大小等,通过重载支持类的运算。 运算符重载:①体现了程序的可读性;②体现了C++ 阅读详情

这里写自定义目录标题

今天复习的是运算符的重载,运算符的重载可以使我们自定义的类型更像是一个内置类型,可以便捷的使用 +,-,*,/,++,–,<<,>>等符号直接进行操作。
我实现的是一个复数类型的重载

Complex.h   里边是复数类的函数声明
#pragma once
#include<iostream>
class Complex
{
public:
	Complex(): _real(0.0),_virtual(0.0) {  };   //构造函数


	Complex(double r, double i) : _real(r), _virtual(i) //构造函数
	{
		std::cout << "构造函数被调用" << std::endl;

	}
	Complex(const Complex& other):_real(other._real),_virtual(other._virtual) //拷贝构造函数
	{
	  std::cout << "拷贝构造函数被调用"<<std::endl;
	}
	Complex(Complex&& other)noexcept :_real(other._real), _virtual(other._virtual) //移动拷贝构造函数
	{
		std::cout << "移动拷贝构造函数被调用" << std::endl;
	}

	virtual ~Complex() {
		std::cout << "析构函数被调用" << std::endl;
	}


	

	double get_real()const;  //访问实部
	void set_real(double x);//设置实部
	double get_virtual()const; //访问虚部
	void set_virtual(double y); //设置虚部
	void print_complex()const;  //打印函数

	//运算符重载
	//返回类型 operator 运算符符号 (参数列表) 
	// {
	//	// 运算符实现
	//  }
	//注意 函数声明后边带 const 表示不改变函数的成员变量
	Complex operator + (const Complex& x)const;  //重载+
	Complex operator - (const Complex& x)const;  //重载-
	Complex operator * (const Complex& x)const;  //重载*
	Complex operator / (const Complex& x)const;  //重载/
	Complex& operator = (const Complex& x); //重载=
	Complex& operator ++ ();  //前置
	Complex operator ++(int);//后置++
	Complex& operator -- ();//前置--
	Complex operator --(int);//后置--


	friend std::ostream & operator << (std::ostream & os, const Complex& x);  //友元函数  使用ostream 重载 <<
	friend std::istream& operator >> (std::istream& is, Complex& x);    //友元函数  使用istream 重载 <<
private:
	double _real;
	double _virtual;

};


Complex.cpp
#include "Complex.h"
#include<iostream>



double Complex::get_real()const { return _real; }
void Complex::set_real(double x) { _real = x; }
double Complex::get_virtual()const { return _virtual; }
void Complex::set_virtual(double y) { _virtual = y; }

void Complex::print_complex() const{ std::cout << _real << "+" << _virtual<<"i"<<std::endl; }


Complex Complex:: operator + (const Complex& x) const { return Complex(_real+x.get_real() , _virtual+x.get_virtual() ); }
Complex Complex:: operator - (const Complex& x)const{ return Complex(_real - x.get_real(), _virtual - x.get_virtual()); }
//复数*运算公式   (a + bi)(c + di) = (ac - bd) + (ad + bc)i   
Complex Complex:: operator * (const Complex& x)const{ 

	return Complex(_real * x._real- _virtual * x._virtual,_real*x. _virtual +_virtual* x._real);
}

//复数的除法公式 (a + bi) / (c + di) = [(ac + bd) + (bc - ad)i] / (c² + d²),确保分母不为零。
Complex Complex:: operator / (const Complex& x)const {
	double denominator = x._real * x._real + x._virtual * x._virtual;
	if (denominator == 0) {
		std::cerr << "Error: Division by zero!" << std::endl;
		return Complex(_real,_virtual);
	}
	return Complex((_real * x._real + _virtual * x._virtual)/denominator, (_virtual * x._real - _real * x._virtual)/denominator);
}

//  每一个对象都有一个this指针,通过*this可以返回当前对象,这样可以不用出现临时对象
Complex& Complex::operator = (const Complex& x) {
	if(this != &x)
	{ 
	_real = x._real;
	_virtual = x._virtual;}
	return *this;
}


Complex& Complex::operator ++ ()//前置++ ++a
{
	_real++;
	_virtual++;
	return *this;
}
//Complex Complex::operator ++(int)//后置++  a++
//{
//	Complex tmp(*this);
//	_real++;
//	_virtual++;
//	return tmp;
//}

Complex Complex::operator ++(int)//后置++  a++
{
	return Complex(_real++,_virtual++);
}

Complex& Complex::operator -- ()//前置++ ++a
{
	_real--;
	_virtual--;
	return *this;
}

Complex Complex::operator --(int)//后置++  a++
{
	return Complex(_real--, _virtual--);
}

std::ostream& operator<<(std::ostream& os, const Complex& x)
{
	os << x._real;

	if (x._virtual >= 0) {
		os << " + " << x._virtual << "i";
	}
	else {
		os << " - " << -x._virtual << "i";
	}
	return os;
}
std::istream& operator >> (std::istream& is, Complex& x)
{
	is >> x._real >> x._virtual;
	return is;
}
test.cpp


#include"Complex.h"
#include<iostream>
using namespace std;

int main()
{
	 Complex a(1.0, 2.0);
	 a.print_complex() ;
	Complex c = a + a;
	c.print_complex();
	Complex d = c - a;
	d.print_complex();
	Complex e = a * a;
	e.print_complex();
	Complex f = a / a;
	f.print_complex();
	Complex g(a);
	g.print_complex();

	d = a++;
	d.print_complex();
	a.print_complex();
	e = ++a;
	e.print_complex();
	a.print_complex();
	cout << a << endl;
	cin >>e;
	cout << e << endl;
	return 0;
}

在这里插入图片描述如果我的后置++定义为

Complex Complex::operator ++(int)//后置++  a++
{
	Complex tmp(*this);
	_real++;
	_virtual++;
	return tmp;
}

在这里插入图片描述
这个涉及到 拷贝构造函数和移动拷贝构造函数,可以去我前边的文章看–》》拷贝构造和移动拷贝构造

基于TI C2000的CCS安装与工程创建完整示例 手把手演示基于TI C2000系列的CCS安装过程及首个工程创建步骤,涵盖环境配置与常见问题处理,助力快速上手嵌入式开发,ccs安装和工程搭建不再难。 阅读详情

相关推荐

深入解析Dataloader中shuffle机制与随机种子对模型训练的影响

本文深入探讨了Dataloader中shuffle机制与随机种子对机器学习模型训练的影响。通过实际案例分析,详细解释了数据打乱顺序的必要性、随机种子的正确设置方法以及两者协同工作的原理,帮助开发者避免常见陷阱并提升模型训练效果。

weixin_29166013的博客 140

【C++】运算符重载

本文讲解了 C++ 运算符重载的概念与用法,包括成员函数重载、友元函数重载、全局函数重载,以及对 ++、--、<<、>> 等特殊运算符的重载方式

weixin_56167571的博客 1690

【算法】—前缀和与差分详解

前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和5 32 1 3 6 41 21 32 4123453610。

DAY I 的成长之路 6021

【C++】类和对象之操作运算符重载和日期类的实现

重载的知识和某个类的模拟实现

s_little_monster的博客 9879

速腾R128雷达+海康全景相机ROS数据采集避坑实录:从‘雷达不转’到MATLAB标定的完整流程

本文详细记录了速腾R128激光雷达与海康威视全景相机在ROS环境下的数据采集与MATLAB标定全流程。从硬件配置的常见陷阱(如雷达旋转参数设置)、驱动编译的依赖管理,到多传感器同步的实战技巧和MATLAB标定方法,提供了完整的避坑指南和技术方案。特别针对RoboSense R128雷达和海康相机的特殊需求给出了具体解决方案。

weixin_28717807的博客 1218

【路由交换】思科5506防火墙三区域互通

思科 5506 inside outside dmz 互通

baidu_22774701的博客 6203

C++复习(运算符重载)

title: C++复习(运算符重载) tags: C++复习 categories: C++ 1、运算符重载的意义 在C++中,运算符的操作对象只能是基本数据类型,而不能对于类、结构体等复杂数据类型进行操作,因此引入了运算符重载机制。运算符重载对已有的运算符赋予多重含义,使得同一个运算符作用于不同类型的数据时做出不同的行为。 运算符重载实际上是函数重载,它提供了C++的可扩展性。 2、运算符重载的规则 1、只能重载C++已有的运算符,不能创建新的运算符。 2、重载之后的运算符不能改变其优先级和结合.

qq_45797850的博客 1115

推理篇第3节:TensorRT基础——Builder、Engine、ExecutionContext生命周期

TensorRT模型优化与推理流程摘要 TensorRT是NVIDIA的深度学习推理优化器,通过Builder、Engine和ExecutionContext三阶段实现高效推理。Builder负责编译模型,执行图优化和kernel选择;Engine是优化后的推理计划;ExecutionContext管理运行时执行。编译期进行重量级优化(如算子融合、kernel调优),运行时快速执行。TensorRT 10.x引入新API,推荐使用buildSerialized方法。构建流程包括创建Builder、网络定义、

PeterPan的博客 503

c++运算符重载(复习)

关键词,c++,运算符重载

大学生的博客 1705

五万字解析【ROOT 入门指南】

本文是cern官方root入门指南的初步翻译版,还在进一步校对中....

荷塘阅色 208

10年上位机开发踩过的20个坑:C#通信/线程/UI适配避坑指南

通信层:所有通信操作异步化、异常全覆盖,加断线重连+心跳检测,多设备隔离资源;线程层:UI更新必做跨线程判断,共享数据加锁,线程池限流,异常不静默;UI层:适配高分屏/DPI,用布局容器替代固定坐标,多屏场景绑定主屏幕。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 903

C++复习之运算符重载

运算符重载概念 含义:已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时产生不同的行为。 目的:使得C++的运算符能够用来操作对象。 不可重载的运算符(七种) 成员访问运算符 . 成员指针访问运算符 . * ,-> * 域运算符 :: 长度运算符 sizeof 条件运算符 ?: 预处理运算符 # 实质:编写以运算符为名称的函数,使用运算符表达式被解释为对重载函数的使用。运算符函数格式: 返回值类型 operator运算符(形参表){函数体} 注

guangod的博客 598

【学习系列】SAP RAP 7:行为定义-Draft

本文介绍了RAP框架中的草稿表(Draft)功能及其应用。草稿表允许用户临时保存数据,在激活前不影响业务逻辑,支持保存继续、暂存和设备切换功能。草稿分为独占草稿(仅限同一用户编辑)和协作草稿(允许多用户协同编辑)。启用草稿需在行为定义和投影中包含标准action,并创建包含TotalETag等管理字段的草稿表。TotalETag确保草稿转换时活动数据未被修改,而ETagmaster则防止并发修改。文章通过OData调用示例详细说明了ETag验证过程,强调草稿功能由RAP框架自动处理,开发者只需关注定义和配置

DeveloperMrMeng的博客 438

C++ 重载运算符和重载函数

本文描述了函数重载和运算符重载的理解,案例,包括重载++自加运算符,

xiangxiao的博客 1193

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

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++运算符的重载

通过代码实践来解释什么是运算符重载,以及如何应用,并且深度探讨了通过引用返回一个对象会造成的错误问题

XXXTENTAC1ON的博客 1994

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【期末复习】c++知识点大回顾,八篇文章让你永不破防(一)

一、第15章 介绍对象技术 1.简单输入输出 //求a和b两个数之和。 // 求两数之和 (本行是注释行) #include <iostream> //预处理命令 using namespace std; //使用命名空间std int main( ) //主函数首部 { //函数体开始 ......

行码棋 6714

WINCC7.3破解文件

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

C++笔记之运算符重载详解

本文主要内容:一.运算符重载简介1.运算符重载实质2.规则和限制二.运算符的重载形式1.重载为类成员函数2.重载为友元函数3.特殊介绍 一.运算符重载简介 1.运算符重载实质 (1) 对已有的运算符赋予多重含义 (2) 必要性:C++预定义的运算符运算对象只能是基本数据类型,而不适用于用户自定义类型(如 类) (3) 实现机制: 将指定的运算符表达式转化为对运算符函数的调用,运算对象转化运算符函数的实参。 编译系统对重载运算符的选择,遵循函数重载的选择原则。 2.规则和限制 (1) 可以重载的运算符:

小笨聪 949

C++二级复习4(运算符重载)

C++二级复习4(运算符重载) 运算符重载实质是函数的重载,定义一个重载运算符的函数。 给原先的运算符增加功能,但实质是为了给用户的自定义类型(类和对象)的使用提供便利。 一般格式如下: 函数类型 operator 运算符名称(参数表) {对运算符的从在处理} 重载运算符的规则 不能重载的运算符(5个) . * :: sizeof ?: 重载后的运算符必须和用户自定义类型一起使用,使用参数至少...

weixin_43420243的博客 297

C++重载相等运算符operator==的两种方式

最近复习了一下C++的一些基础知识,发现之前理解得不够深刻,或者当时只是简单过了一遍,复习的时候,有了一些新的收获。闲言少叙,书归正文: 问题: C++的重载相等运算符operator==可以写成类成员函数,也可以写成全局普通函数,请问这对于同一个类型的两种重载相等运算符可以同时存在么?如何可以,那么它们的调用优先顺序是怎么样的? 我们还是用一个例子来说明: #include <iostream> class Person { private: int m_age; public: Per

斧冰 2万+

运算符重载复习

运算符重载0.引言1.使用 operator 关键字引入重载函数2.[根据重载特性,可以将运算符进一步划分](https://zh.cppreference.com/w/cpp/language/operators)3.运算符重载 0.引言 1.使用 operator 关键字引入重载函数 函数参数个数与运算操作数个数相同,至少一个为类类型(不能全部都是内建类型) #include<iostream> #include<vector> #include<string>

fb_941219的博客 377

C++运算符重载以及友元

今天继续复习了C++,之前都没认真看过《C++ primer plus》,非常详细的一本书,而且适合查阅与学习。 1.重载 在C++中有很多运算符可以被应用到类与类之间、类与基本类型之间等,我们把这种方法叫做运算符重载,比如有两个类X的实例A和B,将加号(+)在该类中重载以后就能直接使用A+B这样的式子。 下面用《C++ primer plus》中一个重载的例子来说明. 这个例子是一个

请叫我AXin 1434

复习笔记 --C++之重载

复习笔记                                                                                            --C++之重载 函数重载:在同一作用域内函数名相同而参数列表不同定义的来实现功能相同或相似的多个函数,即通过函数参数列表而唯一标识并区分函数的一种特殊的函数。 一.  注意: 1)   函数的参数列

Wei_Yuan_2012的专栏 1135

C++基础复习

1:new的原理:a,调用operator new函数申请空间b,在申请的空间上执行自定义类型的构造函数,完成对象的构造。2:delete的原理:a,在空间上调用析构函数,完成对象中资源的清理工作b,调用operator delete函数释放对象的空间。delete p1;//想模拟上面的行为new(p2)A();//这里想当于从p2的起始位置开始开辟空间p2->~A();return 0;以上就完成了c++基础部分的复习,接下来要复习c++11的新特性和stl库。

zq3296451422的博客 1555

C++基础知识复习&总结

最近面试了3家公司。虽然有知名大公司的工作经历,虽然自己求职的目标职位是系统架构师,但发现用人单位还是看重编程基础能力。不管是自我定位太高,还是职位层次太低,系统复习了一遍很久没有摸过的C++总是有好处的。总结如下:一、new和malloc的区别1、new和delete配对,释放数组需要用delete[]。new和delete实际上调用了malloc和free,另外调用了类的构造函数和析构函数。2、malloc和free配对,malloc返回的是void指针,需要强转。

alvanchen的专栏 4万+

C++程序设计-练手题集合【期末复习|考研复习】

给大家整理了一下C++程序设计中的练手题,以供大家期末复习和考研复习的时候使用。

bblb的博客 2663

复习四——运算符重载

1、格式 类型 类名::operator op(参数表) { } 例一,设计一个安全计数器,重载自增、自减、括号运算符 #include<iostream> #include<cstdlib>//后面有abort(); using namespace std; class calculator { public: calculator(){value=0;} void operator++();//重载自增运算符 void operator-...

weixin_45901806的博客 686
上一篇: C++复习 ---- 命名空间
下一篇: C++复习之 输入输出流 iostream istream ostream fstream详解
秋到亦天凉
博客等级 码龄6年 4238粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋到亦天凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值