C++复数类——运算符重载和类的传递

news2024/9/26 1:28:49

复数:我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位。当虚部等于零时,这个复数可以视为实数;当z的虚部不等于零时,实部等于零时,常称z为纯虚数。


那自然而然我们会想到必定是由两个变量所决定:实部 虚部所以我们就在类中这样定义

Class Copmlex{
    double re;
    double im;
public:
    Complex(double r=0,double i=0) : re(i),im(i) {}
};

从上边可以看出来ptivate是俩double类型,然后初始化函数后将0 0 赋值给re 和 im

接受数据可以如下:

Complex x;     //默认函数 实部虚部都是 0 0
Comple y(1.2); //构造转换函数 实部1.2 虚部0,0
Complex z(1.2,3.7)//构造函数 实部1.2 虚部 3.7 
//其实这里的x和y没有任何的影响,就是为了传入参数前所定义的
#include  <iostream>
using namespace std;
class Complex {
    double re;
    double im;
public:
    Complex(double r=0,double i=0):re(r),im(i){}
    double real() const { return re; }
    double imag() const { return im; }
};
int main()
{
    Complex y(1.2, 2.4); //传入参数
    cout << "实部:" << y.real() << endl;
    cout << "虚部:" << y.imag() << endl;
    return 0;
}

其实这和前边我们学的是一样,相信你能明白的

重载运算符:

如果不做特殊处理,C++ 的 +、-、*、/ 等运算符只能用于对基本类型的常量或变量进行运算,不能用于对象之间的运算。

有时希望对象之间也能用这些运算符进行运算,以达到使程序更简洁、易懂的目的。例如,复数是可以进行四则运算的,两个复数对象相加如果能直接用+运算符完成,不是很直观和简洁吗?

利用 C++ 提供的“运算符重载”机制,赋予运算符新的功能,就能解决用+将两个复数对象相加这样的问题。

运算符重载,就是对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象

运算符重载的实质是编写以运算符作为名称的函数。不妨把这样的函数称为运算符函数。运算符函数的格式如下:

返回值类型  operator  运算符(形参表)
{
    ....
}

包含被重载的运算符的表达式会被编译成对运算符函数的调用,运算符的操作数成为函数调用时的实参,运算的结果就是函数的返回值。运算符可以被多次重载。

运算符可以被重载为全局函数,也可以被重载为成员函数。

#include  <iostream>
using namespace std;
class Complex {
    
public:
    double re;
    double im;
    Complex(double r=0,double i=0):re(r),im(i){}
    Complex operator -(const Complex& c);
    //Complex operator + (const Complex& y, const Complex& x);
//    double real() const { return re; }
//    double imag() const { return im; }
};
Complex operator + (const Complex& y, const Complex& x) {
    return Complex(y.re + x.re, y.im + x.im); //返回临时值
}
Complex operator - (const Complex& y, const Complex& t) {
    return Complex(t.re + y.re, y.im + t.im); //返回临时值
}
Complex Complex::operator-(const Complex& c) {
    return Complex(re - c.re, im - c.im);
}
int main()
{
    Complex y(1.2, 2.4),x(2.3,3.4),t,s; //传入参数
    t = y + x; //等价于 operator + (y,x)
    s = y - t;
    cout << "实部:" << t.re << endl;
    cout << "虚部:" << t.im << endl;

    cout << (y - x).re << "," << (y - x).im << endl;

    cout << "输出y-t =:";
    cout << s.re << "," << s.im << endl;
    return 0;
}

Complex operator + (const Complex& y, const Complex& x) {
    return Complex(y.re + x.re, y.im + x.im); //返回临时值
}
Complex operator - (const Complex& y, const Complex& t) {
    return Complex(t.re + y.re, y.im + t.im); //返回临时值
}
........
 t = y + x; //等价于 operator + (y,x)
 s = y - t;

看上述这段,其实只是改变了+ 和 - 的符号,

:+和-运算符的实体就是作为成员函数的来实现运算符函数的operator+ 和operator-,因此使用+和-就意味着去调用该运算符的函数 :验证说法

........    
Counter& operator++()  //前置增
    {
        if (cnt < UINT_MAX)
            cnt++;
        return *this;

    }
    Counter operator++(int) {
        Counter x = *this;
        if (cnt < UINT_MAX) cnt++;
        return *this;
    }
  ........
    for (int i = 0; i < no; i++) {
        cout << x++<< ' ' << ++y<<' ' <<++x<< '\n';
    }

这个代码是上一文章的部分片段,当你的main函数中不是使用++系统会提醒你报错了,或者数值不正确,这也是一方面说就是在调用class中的那个函数

类值的传递

Comlex x,y,z;
//....
z= x+y
z= x+ 7.5;
z=7.5+x;  //编译错误
z=y+x  等价于 z= y.operator+(x);

z= x+ 7.5;等价于 z=x.operator + (7.5) //来进行传递阐述

如果传递俩参数呢:z=x.operator+(Complex(7.5,2.1)) 其实就是7.5是实部,2.1是虚部


那为啥说 z=7.5+x; //编译错误

因为7.5是内置的double类型,但是不是类的内置类型,double型成员没有函数,所以不能调用

引用文章:

原文链接:https://blog.csdn.net/qq_27278957/article/details/85269245

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kotlin】类的继承 ② ( 使用 is 运算符进行类型检测 | 使用 as 运算符进行类型转换 | 智能类型转换 | Any 超类 )

文章目录一、使用 is 运算符进行类型检测二、使用 as 运算符进行类型转换 ( 智能类型转换 )三、Any 超类一、使用 is 运算符进行类型检测 在 Kotlin 中 , 如果不确定一个 实例对象的类型 , 可以 使用 is 运算符进行判定 , 使用方法 实例对象 is 判定类型上述用法可以判定 实例…

Windows11快速入门

1、如何快速上手Win11 Win11官网&#xff1a;https://www.microsoft.com/zh-cn/windows/windows-11?r1 Windows 帮助和学习&#xff1a;https://support.microsoft.com/zh-cn/windows?uizh-CN&rszh-CN&adCN) 2、Win11常用快捷键 2.1、文本编辑快捷键 功能描述快捷键…

【JavaGuide面试总结】MySQL篇·下

【JavaGuide面试总结】MySQL篇下1.介绍一下索引吧2.索引的优缺点3.讲一下索引的底层数据结构Hash 表B 树& B树1.介绍一下索引吧 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 索引的作用就相当于书的目录。打个比方: …

SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除

看了好多文章&#xff0c;都只讲了基础的demo用法&#xff0c;也就是简单的创建运行定时任务&#xff0c;对定时任务的管理却很少。 我这里从0开始搭建一个简单的demo&#xff0c;包括定时任务的各种操作&#xff0c;以及API的一些用法&#xff0c;可以实现大多场景的需求。如…

A-Star算法探索和实现(四)

本篇摘要上一篇我们针对障碍物的“死胡同”问题进行了探索&#xff0c;本篇则针对障碍物生成在网格对角顶点处是否有意义以及路径周围存在障碍物时按照对角线移动是否合理两个问题进行探讨&#xff0c;这两个问题主要在于移动规则的限定&#xff0c;主要分为以下两种情况&#…

uniapp富文本内容样式改变处理方式

前言 在日常工作中经常会遇到富文本内容渲染的需求,最常见的问题是页面样式调整好之后,对服务端返回的富文本内容进行渲染时图片显示会有问题,原因在于富文本中的图片信息没有样式处理或是添加样式与父组件中样式不一致.正常显示: 异常显示: 下面就讲一下对于富文本图片样式修…

Jenkins企业邮箱的配置和发送(win版)

在学习jenkins时&#xff0c;我把jenkins安装在自己的笔记本电脑上&#xff0c;以下的配置过程均在win10下进行。 一&#xff1a;安装邮件扩展插件 进入Dashboard——>Manage Jenkins——Manage Plugins——可选插件下选择Email Extension Plugin并“install without rest…

CUDA编程笔记(3)

文章目录前言1.CUDA程序运行时的错误检测检测运行错误的头文件检查运行时的CUDA的api函数检查运行时的CUDA的核函数CUDA-MEMCHECK工具总结前言 CUDA程序运行时的错误检测 1.CUDA程序运行时的错误检测 检测运行错误的头文件 像一些日志文件&#xff0c;一般检测错误都会编写…

浅谈C#多线程 异步编程

背景&#xff1a;线程&#xff08;英语&#xff1a;thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程…

leetcode-11:1814. 统计一个数组中好对子的数目

原题为&#xff1a; 给你一个数组 nums &#xff0c;数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) 321 &#xff0c; rev(120) 21 。我们称满足下面条件的下标对 (i, j) 是 好的 &#xff1a; 0 < i < j < nums.l…

由浅入深使用validation框架进行参数校验

1 引言 平时在业务开发过程中 controller 层的参数校验有时会存在下面这样的判断 public String add(UserVO userVO) {if(userVO.getAge() null){return "年龄不能为空";}if(userVO.getAge() > 120){return "年龄不能超过120";}if(userVO.getName().is…

Mysql安全之权限用户管理参考手册

一、背景 日常Mysql维护过程中&#xff0c;基于安全要求和规定&#xff0c;需要对Mysql进行分权&#xff0c;接入金库、账户密码满足16位复杂度&#xff0c;对特定表授权&#xff0c;只读用户&#xff0c;最小化权限等处理&#xff1b;本文简要梳理下常用命令操作&#xff0c;…

vue2.x中$attrs的使用

最近笔者在做大屏项目的时候&#xff0c;由于组件数据传递&#xff0c;一层传递一层&#xff0c;使用vuex或者pinia又显得过于笨重。故而想起了那个传说中的v-bind"$attrs"以及v-on"$listeners"&#xff0c;下面就来聊下使用&#xff1a; 上图组件之间的关…

2022年度盘点|FinClip 扩展SDK推荐

2022年&#xff0c;FinClip 团队进行了24个产品迭代&#xff0c;为了丰富FinClip 的平台能力&#xff0c;除了核心SDK之外&#xff0c;我们还为开发者们提供了扩展SDK&#xff0c;扩展SDK是一个依赖核心SDK的库&#xff0c;里面提供了核心SDK中所没有的各种小程序API。 官方希…

[从零开始]用python制作识图翻译器·四

具体实现 整个工程文件已经上传到我的代码仓库。 正式开始 项目结构 数据存储 因为本系统为自用而非商用&#xff0c;并且偏向功能性&#xff0c;所以直接用一个config.json文件保存所有的用户数据&#xff0c;就不用加密了。 原型设计 如图&#xff0c;本系统一共包含两个用…

mp4是什么格式?如何录制mp4格式的视频?一招解决

相信不少的小伙伴都听说过mp4格式&#xff0c;或者在日常的学习生活中就接触过不少mp4格式的文件。但也有不少的小伙伴还不是很了解mp4。mp4是什么格式&#xff1f;我们又该如何录制mp4格式的视频呢&#xff1f;今天小编教大家一招&#xff0c;轻松解决这个问题。 一、mp4是什么…

python3.11安装, 解决pip is configured with locations that require TLS/SSL问题

系统&#xff1a;centos7.4&#xff08;虚拟机&#xff09;python版本&#xff1a;本机自带的2.7.5&#xff0c;以及参考python安装的python3.11pip版本&#xff1a;本机自带的8.1.2&#xff0c;参考pip安装&升级升级到了20.3.4&#xff0c;pip3版本为22.3.1openssl版本&am…

【新年快乐】禁止燃放烟花爆竹那就用Python画场烟花秀吧

目录 前言 Python界面设计之Tkinter 简单创建一个界面 在界面上创建画布 导入图片到界面中 其他一些重要函数 用Python画一场烟花秀 烟花的粒子类 烟花秀的实现 完整程序 前言 新年即将来临&#xff0c;在这个举国欢庆的日子里&#xff0c;怎么能少的了灿烂又热…

Spring AOP统一功能处理(切面、切点、连接点、通知)

目录 一、 AOP的一些前置知识 1.1什么是Aop 1.2 AOP的作用 1.3AOP基础组成 二、SpringAOP的实现 2.1添加SpringAOP框架支持 2.2定义切面(Aspect) 2.3定义切点(Pointcut) 2.4定义通知(Advice) 三、实例展示&#xff08;计时器&#xff09; 代码实现 一、 AOP的一些前…

常用损失函数-交叉熵损失函数、MAE、MSE、smoothL1

目录标题常见的损失函数1、分类任务1.1 多分类任务1.2 二分类任务2、 回归任务2.1 MAE损失2.2 MSE损失2.3 smooth L1损失总结常见的损失函数 损失函数&#xff1a;衡量模型参数的质量的函数&#xff0c;衡量方式是比较网络输出和真实输出的差异。ybar与y 之间的差异 损失函数、…