运算符重载

C++复数类实现运算符重载 目录: 1.关于运算符重载 2.运算符重载的方式:成员函数和友元函数 3.只能用成员函数重载的运算符 4.利用复数类实现运算符重载 1.关于运算符重载 运算符重载就是对现有的运算符重新定义,赋予其另一种功能,以实现不同的数据类型。其本质还是函数的重载,使用运算符重载可以使程序更清晰。运算符重载的关键字operator。C++绝大多数运算符都可以重载,不能重载的运算符有. :: .... 阅读详情
所谓重载,就是重新赋予新的含义,函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。
运算符的重载主要存在两种形式,一种是作为类的成员函数进行使用,另一种则是作为类的友元函数进行使用。运算符的重载的形式为:
   返回类型 operator 运算符符号(参数说明)
    {    
           //函数体的内部实现
    }

例如,能否用“+”号进行两个复数的相加,在C++中不能在程序中直接用运算符“+”对复数进行相加运算,用户必须自己设法实现复数相加。例如用户可以通过定义一个专门的函数来实现复数相加。

/*
实现复数类中的运算符重载
定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。
方案一:使用类的成员函数完成运算符的重载;
*/
#include<iostream>
using namespace std;

class Complex
{
private:
    double real;
    double imag;
public:
    Complex()
    {
        real = 0 ; imag = 0 ;
    }
    Complex(double r,double i)
    {
        real = r ; imag = i ;
    }
    Complex operator+(Complex &c2);
    Complex operator-(Complex &c2);
    Complex operator*(Complex &c2);
    Complex operator/(Complex &c2);
    void display();
};

//下面定义成员函数
Complex Complex::operator+(Complex &c2) //定义重载运算符”+“的函数
{
    return Complex(this->real+c2.real , this->imag+c2.imag);   //此处this->real就是c1.real
}
Complex Complex::operator-(Complex &c2)//定义重载运算符”-“的函数
{
    return Complex(this->real-c2.real , this->imag-c2.imag);   //此处this->real就是c1.real
}

Complex Complex::operator*(Complex &c2)  
{
    return Complex(this->real*c2.real , this->imag*c2.imag);   //此处this->real就是c1.real  
}

Complex Complex::operator/(Complex &c2)  
{
    Complex c;      
    c.real = (real*c2.real + imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);      
    c.imag = (-real*c2.imag + imag*c2.real)/(c2.real*c2.real+c2.imag*c2.imag);     
    return c;      
}   

void Complex::display()
{
    cout<<"("<<real<<","<<imag<<"i)"<<endl;
}

int main(void)
{
    Complex c1(3,4),c2(5,-10),c3;
    cout<<"c1=";
    c1.display();
    cout<<"c2=";
    c2.display();
    c3=c1+c2;   // 此处相当于非重载运算符函数中的“c3=c1.Complex_add(c2)
    //将运算符+重载为类的成员函数后,编译系统会将程序中的表达式c1+c2解释为:c1.operator+(c2)即以c2为实参调用c1的运算符重载函数operator+(Complex&c2),operator+是类的一个函数名
    cout<<"c1+c2=";
    c3.display();
    c3=c1-c2;
    cout<<"c1-c2=";
    c3.display();
    c3=c1*c2;
    cout<<"c1*c2=";
    c3.display();
    c3=c1/c2;
    cout<<"c1/c2=";
    c3.display();
    return 0;
}
运算符重载运算符的运算规则
      ①运算符重载函数也是函数,重载的运算符不会改变运算符的优先级、结合型和参数的个数。
      ②重载运算符不能违反语言的语法规则。
      ③赋值运算符除外,重载运算符可由派生类继承下去。
      ④重载运算符不能使用默认参数。
      ⑤运算符=、()、[]和->等操作符必须定义为类的成员函数,将这些操作符定义为友元函数将在编译时标记为错误。
     
⑥C++中不能重载的运算符只有5个:
       .  (成员访问运算符)
       .* (成员指针访问运算符)
       ∷ (域运算符)
       sizeof(长度运算符)
       ?: (条件运算符)

      因为前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和sizeof运算符的运算对象是类型而不是变量或一般表达式,不具重载的特征。
      ⑦友元运算符的参数规则与类成员运算符的参数规则不同,一员运算符必须显示地声明一个参数,二员运算符必须显示地声明两个参数。类成员运算符重载时,参数中隐含了一个this指针。(另外,C++规定,有的运算符(如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流输入“>>”和流输出“<<”运算符、类型转换运算符))。
重载为类的成员函数时,参数个数=原操作数个数-1(后置++、--除外),它可以通过this指针自由地访问本类的数据成员,可以少写一个函数的参数,但必须要求运算表达式的第一个参数(即运算符左侧的操作数)是一个类对象。
重载为类的友元函数时,参数个数=原操作数个数,且至少应该有一个自定义类型的形参。
//方案二:使用类的友元函数,而不是类的成员函数,完成上面提及的运算符的重载;
#include<iostream>
using namespace std;

class Complex
{
private:
	double real;
	double imag;
public:
	Complex()    //定义构造函数
	{
		real = 0 ; imag = 0 ;
	}
	Complex(double r,double i)    //构造函数重载
	{
		real = r ; imag = i ;
	}
	friend Complex operator+(Complex &c1,Complex &c2);
	friend Complex operator-(Complex &c1,Complex &c2);
	friend Complex operator*(Complex &c1,Complex &c2);
	friend Complex operator/(Complex &c1,Complex &c2);
	void display();
};

//下面定义友员函数 
Complex operator+(Complex &c1,Complex &c2)  //定义重载运算符”+“的函数
{
	return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
Complex operator-(Complex &c1,Complex &c2)  //定义重载运算符”-“的函数
{
	return Complex(c1.real-c2.real,c1.imag-c2.imag);
}
Complex operator*(Complex &c1,Complex &c2)  //定义重载运算符”*“的函数
{
	return Complex (c1.real*c2.real,c1.imag*c2.imag);
}
Complex operator/(Complex &c1,Complex &c2)  //定义重载运算符”/“的函数
{
	return Complex(c1.real/c2.real,c1.imag/c2.imag);
}
void Complex::display()
{
	cout<<"("<<real<<","<<imag<<"i)"<<endl;
}

int main(void)
{
	cout<<"用友员函数输出的结果是"<<endl;
	Complex c1(3,4),c2(5,-10),c3;
	cout<<"c1=";
	c1.display();
	cout<<"c2=";
	c2.display();
	c3=c1+c2;
	cout<<"c1+c2=";
	c3.display();
	c3=c1-c2;
	cout<<"c1-c2=";
	c3.display();
	c3=c1*c2;
	cout<<"c1*c2=";
	c3.display();
	c3=c1/c2;
	cout<<"c1/c2=";
	c3.display();
	return 0;
}
如想将一个复数和一个整数相加,如c1+i,可以将运算符重载函数作为成员函数,如下面的形式:
Complex Complex::operator +(int &i)   //运算符重载函数作为Complex类的成员函数
{
	return Complex(real + i , imag);
}
注意在表达式中重载的运算符“+”左侧应为Complex类的对象,如
c3=c2+i;
不能写成
c3=i+c2;   //运算符“+”的左侧不是类对象,编译出错
如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式i+c2,运算符左侧的操作数i是整数),这时是无法利用前面定义的重载运算符的,因为无法调用i.operator+函数。可想而知,如果运算符左侧的操作数属于C++标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在Complex类中声明:
friend Complex operator+(int &i , Complex &c);   //第一个参数可以不是类对象
在类外定义友元函数:
Complex operator+(int &i , Complex &c)  //运算符重载函数不是成员函数
{
	return Complex(i + c.real , c.imag);
}
将双目运算符重载为友元函数时,在函数的形参表列中必须有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第二个参数对应。如
c3 = i + c2;  //正确,类型匹配
	c3 = c2 + i;  //错误,类型不匹配
如何重载增量运算符 ++ 和 --
    运算符++和—有前置和后置两种形式,如果不区分前置和后置,则使用operator++( )或operator--( )即可;否则,要使用operator++( )或operator--( )来重载前置运算符,使用operator++(int)或operator--(int)来重载后置运算符,调用时,参数int被传递给值0。如下列程序段:

//重载增量运算符 ++ 和 --
#include<iostream>
using namespace std;

class Complex
{
private:
	int x;
	int y;
public:
	Complex()    //定义构造函数
	{
		x = 0 ; y = 0 ;
	}
	Complex(int a,int b)    //构造函数重载
	{
		x = a ; y = b ;
	}
	void display();
	Complex operator ++();      //前置自增方式
	Complex operator ++(int);   //后置自增方式(增加一个int类型的形参)
};

Complex Complex::operator ++()
{
	x = x + 1;
	y = y + 1;
	return *this;
}
Complex Complex::operator ++(int)
{
	Complex temp(*this);
	x = x + 1;
	y = y + 1;
	return temp;
}
void Complex::display()  
{  
	cout<<"("<<x<<","<<y<<")"<<endl;  
}
int main(void)
{
	Complex c1(3,4),c2(5,-10),c3;
	c3 = c1++;
	cout<<"c1++=";
	c3.display();
	c3 = ++c2;
	cout<<"++c2=";
	c3.display();
	return 0;
}

  重载流输入运算符和流输出运算符

istream  类的对象cin;
ostream类的对象cout;
如果想直接用“<<”和“>>”输出和输入自己声明的类型的数据,必须对它们重载,对“<<”和“>>”重载的函数形式如下:
istream & operator >> (istream &,自定义类 &);
ostream & operator << (ostream &,自定义类 &);

重载运算符“>>”的函数的第一个参数和函数的类型都必须是istream&类型,第二个参数是要进行输入操作的类。
重载“<<”的函数的第一个参数和函数的类型都必须是ostream&类型,第二个参数是要进行输出操作的类。
只能将重载“>>”和“<<”的函数作为友元函数或普通的函数,而不能将它们定义为成员函数。

实现代码如下:

//增加重载流提取运算符“>>”,用“cin>>”输入复数,用“cout<<”输出复数。
#include<iostream>
using namespace std;

class Complex
{
private:
	double real;
	double imag;
public:
	Complex()    //定义构造函数
	{
		real = 0 ; imag = 0 ;
	}
	Complex(double r,double i)    //构造函数重载
	{
		real = r ; imag = i ;
	}
	friend istream& operator>>(istream & , Complex & );
	friend ostream& operator<<(ostream & , Complex & );
};

//下面定义友员函数 
istream& operator>>(istream & in, Complex &c)
{
	cout<<"input real part and imaginary part of complex number:";
	in>>c.real>>c.imag;
	return in;
}
ostream& operator<<(ostream & out, Complex &c)
{
	out<<'('<<c.real<<"+"<<c.imag<<"i)";
	return out;
}

int main(void)
{
	Complex c1 , c2;
	cin>>c1>>c2;
	cout<<"c1="<<c1<<endl;
	cout<<"c2="<<c2<<endl;
	return 0;
}


第四章 运算符重载之——运算符重载的概念 1、运算符重载就是给已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得运算符也能够用来操作对象。 2、C++允许重载大多数运算符,不允许重载的有: 成员访问运算符 . 成员指针访问运算符 .* 、 ->* 域运算符 : : 长度运算符 sizeof 条件运算符 ? : 预处理符 # 用于类运算的运算符通常都要重载, = 默认重载为成员变量的复制 & 默认重载为返回任何类对象的地址 3、运算符重载的实质是编写以运算符为名称的函数,使用 阅读详情

相关推荐

保姆级!n8n 公众号自动化:从 0 搭 “写文案 + 生图 + 发草稿” 全流程

【摘要】本文介绍如何利用n8n搭建全自动公众号内容发布流程,涵盖AI文案生成、封面图制作到自动发布的全链路解决方案。通过对接OpenRouter大模型、阿里云百炼生图API及微信官方接口,实现从内容创作到发布的自动化。重点包括:1)n8n微信节点安装配置;2)大模型API授权与提示词优化技巧;3)图片生成与格式转换处理;4)公众号接口授权注意事项;5)草稿自动生成参数设置要点。特别提醒首次配置时需关闭自动发布功能以检查效果,避免格式错误导致发布失败。该方案无需复杂编程,适合运营人员快速搭建自动化内容生产流程

Jacket0603的博客 1594

【C++】运算符重载——复数类

CComplex类 class CComplex { public: CComplex(int real, int image) :mreal(real), mimage(image) {} private: int mreal;//实部 int mimage;//虚部 }; int main() { CComplex c1(10, 20); CComplex c2 = c1 + 10; CComplex c3 = 10 + c1; CComplex c4 = c1 + c2;

维欣~fighting✔ 2438

Apache-Plc4x-Modbus-Tcp学习记录(一)

Apache-Plc4x-Modbus-Tcp学习记录(一)

weixin_45325423的博客 6988

复数类的运算符重载

#include &lt;iostream&gt; using namespace std; class Complex { public: Complex(const double _real, const double _image); Complex(const Complex&amp; complex); ~Complex(); Complex&amp; operator=(const ...

ZWE7616175的博客 631

2 海康视觉平台VisionMaster 上手系列:大纲及准备

海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 1万+

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南

本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。

weixin_29070721的博客 474

复数类加减乘除的运算符重载

我的理解:重载运算符实际上是在使用“operator符号”时调用一个函数,而这个函数是事先写好的,只是在调用时,用的不是它的名,而是“operator符号”.

小西 2873

从零到一:手把手教你用C#开发AGV调度系统(附避坑指南)

本文详细介绍了如何使用C#开发高效的AGV调度系统,涵盖从环境搭建到核心算法实现的完整流程。重点解析了动态路径规划、多机协同等关键技术,并提供了实用的避坑指南和性能优化建议,帮助开发者快速构建工业级车辆控制调度系统。

blockchain9miner的博客 742

运算符重载之友元运算符重载

友元可以参考:https://blog.youkuaiyun.com/aaqian1/article/details/84427884 友元运算符重载函数: 把运算符重载函数定义为某个类的友元函数。 1、定义友元运算符重载函数的语法形式 (1)在类的内部,定义友元运算符重载函数的格式如下: friend 函数类型 operator 运算符(形参表) { 函数体 } (2)友元运算符重载函数也可以在类中声明...

aaqian1的博客 1万+

从零到一:i.MX8M Plus开发板全流程开发指南(源码编译、烧录、镜像运行)

本文详细介绍了i.MX8M Plus开发板的全流程开发指南,包括源码编译、烧录和镜像运行等关键步骤。通过实战案例和配置技巧,帮助开发者快速掌握工业级应用开发,提升在边缘计算和AI推理等领域的开发效率。

weixin_30687051的博客 571

BES 平台 SDK之 美格信Dongle 连接

最近项目到了试产阶段,需要用到美格信的Dongel 来测试ANC 相关功能。在此简单介绍下如何连接Dongel 的操作步骤。

谢文浩博客 925

C++运算符重载(类内、外重载)

1.概念   运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能。这个函数叫做运算符重载函数(常为类的成员函数)。 2.运算符重载的基本格式    返回值类型 类名::operator重载的运算符(参数表)    {    ……    }    operator是关键字,它与重载的运算符一起构成函数名。 3.运算符重载的两种方法 1.类内重载 #include <iostream> using namespa

u014583317的博客 7万+

核心组件大换血:Backbone与Neck魔改篇:YOLO26结合StarNet结构:2026星状网络在YOLO生态的即插即用实战

本文将介绍如何将StarNet作为Backbone替换YOLO26原生架构,以提升边缘设备上的目标检测性能。文章首先分析了YOLO26在特定场景下的精度瓶颈,指出其通用Backbone设计存在不足。随后深入解析StarNet的核心创新——星操作(Star Operation),这一低维计算却能获得高维特征表达的数学魔术,以及其极简的StarBlock模块设计。通过对比YOLO26原生架构的三大创新与痛点,作者提出两种替换策略:完整替换Backbone或局部替换+Neck联调。文中提供了StarNet核心代码

ZDQ58818的博客 289

运算符重载之成员运算符重载

成员运算符重载函数 成员运算符重载函数,即把运算符重载函数定义为某个类的成员函数。 1、定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表){ 函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义。 在类内,声明成员运算符重载函数原型的格式如下: class X{ 函数类型 operat...

aaqian1的博客 4555

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++——运算符重载

运算符重载:对数据类型已有的运算符重新进行定义赋予另一种功能,以适应不同的数据类型对于内置数据类型,编译器知道如何进行运算int a = 10;int b = 20;//计算机知道如何计算但是如果是两个自定义的类相加计算机就不知道如何计算,因为加号两边不是系统内置的数据结构。

头秃中。。。。。 4097

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

运算符重载———运算符重载的基本概念

引入运算符重载的目的: 由于C++预定义的运算符,只能用于基本数据类型的运算:整型、实型、字符型、逻辑型,导致对象无法通过运算符进行运算。故引入了运算符重载。 运算符重载: 1:运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。 2:运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。 3:运算符重载的实质是函数重载,可以重载为普通函数,也可以重载为成员函数 4:把含运算符的表达式转换成对运算符函数的调用。

qq_44923545的博客 7730

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

重载学习——函数重载与运算符重载

一枚小新,有问题欢迎共同探讨~

weixin_62377025的博客 2674

c++之运算符重载

前言 本篇文章主要写的是关于c++运算符重载的问题,运算符重载是c++中比较重要的概念。本篇文章用了大量的实例来说明c++运算符重载,因此文章的篇幅可能会比较大。 一、什么是运算符重载 在c++中我们都知道有函数重载的概念,在类和对象的设计中还设计到了成员函数重载。同样c++也提供了运算符的重载,所谓重载,就是赋予新的含义。实际上我们在前期的学习过程中已经不知不觉使用了运算符重载,如"<<“和”>>“本来是c++的位移运算符,但是却可以用来输入与输出,这是因为c++系统对”<&

weixin_44974029的博客 3671

函数重载和运算符重载

函数重载和运算符重载,实现了常见的==运算符、=运算符、+、+=运算符,

crawer 1546

C++ 运算符重载+赋值运算符重载

当运算符被用于类类型的对象时,C++ 语言允许我们通过运算符重载的形式指定新的含义。C++ 规定类类型对象使用运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。运算符重载是具有特殊名字的函数,他的名字是由 operator 和后面要定义的运算符共同构成。和其他函数一样,它也具有其返回类型和参数列表以及函数体。重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。

Jason_from_China的博客 1684

【C++】运算符重载

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

weixin_56167571的博客 1690

一文读懂C++运算符重载&运算符重载函数

通过运算符重载,扩大了C++已有运算符的作用,使运算符能用于类对象;使用运算符重载,能使程序易于编写、阅读和维护;运算符被重载后,其原有的功能仍然保留,没有丧失或改变。 二、通过运算符重载函数实现运算符的重载 运算符重载函数的一般形式:注:1)形参列表里可以不止一个参数;如果是对象的话,需要“类名&对象名”的形式 1、不允许创造新的运算符,只能对已有的C++运算符进行重载。2、重载不能改变运算符运算量的个数(即操作数),不能改变运算符的优先级,不能改变运算符的结合性。3、重载运算符的函数不能带

pl0020的博客 3009
上一篇: 百度2012实习生校园招聘笔试题
下一篇: 虚函数和纯虚函数的区别
hackbuteer1
博客等级 码龄15年 1万+粉丝 251原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值