实验七,运算符重载

2023-10-31

一、实验目的和要求

  熟悉运算符重载的定义和使用方法

二、实验内容

1.调试下列程序

//sy7_1.cpp  
#include<iostream>  
using namespace std;  
class complex  
{  
    public:  
        complex(){real=imag=0.0;}  
        complex(double r){real=r;imag=0.0;}  
        complex(double r,double i){real=r;imag=i;}  
        complex operator + (const complex &c);  
        complex operator - (const complex &c);  
        complex operator * (const complex &c);  
        complex operator / (const complex &c);  
        friend void print(const complex &c);  
    private:  
        double real,imag;  
};  
inline complex complex::operator + (const complex &c)  
{  
    return complex(real+c.real,imag+c.imag);  
}  
inline complex complex::operator - (const complex &c)  
{  
    return complex(real-c.real,imag-c.imag);  
}  
inline complex complex::operator * (const complex &c)  
{  
    return complex(real*c.real-imag*c.imag,real*c.imag+imag*c.real);  
}  
inline complex complex::operator / (const complex &c)  
{  
    return complex((real*c.real+imag*c.imag)/(c.real*c.real+c.imag*c.imag),(imag*c.real-real*c.imag)/(c.real*c.real+c.imag*c.imag));  
}  
void print(const complex &c)  
{  
    if(c.imag<0)  
        cout<<c.real<<c.imag<<"i";  
    else  
        cout<<c.real<<"+"<<c.imag<<"i";  
}  
int main()  
{  
    complex c1(2.0),c2(3.0,-1.0),c3;  
    c3=c1+c2;  
    cout<<"\nc1+c2= ";  
    print(c3);  
    c3=c1-c2;  
    cout<<"\nc1-c2= ";  
    print(c3);  
    c3=c1*c2;  
    cout<<"\nc1*c2= ";  
    print(c3);  
    c3=c1/c2;  
    cout<<"\nc1/c2= ";  
    print(c3);  
    c3=(c1+c2)*(c1-c2)*c2/c1;  
    cout<<"\n(c1+c2)*(c1-c2)*c2/c1= ";  
    print(c3);  
    cout<<endl;  
    return 0;  
}  

运行结果:


2、调试下列程序

//sy7_2.cpp  
#include<iostream>  
using namespace std;  
class complex  
{  
    public:  
        complex(){real=imag=0.0;}  
        complex(double r){real=r;imag=0.0;}  
        complex(double r,double i){real=r;imag=i;}  
        friend complex operator + (const complex &c1,const complex &c2);  
        friend complex operator - (const complex &c1,const complex &c2);  
        friend complex operator * (const complex &c1,const complex &c2);  
        friend complex operator / (const complex &c1,const complex &c2);  
        friend void print(const complex &c);  
    private:  
        double real,imag;  
};  
complex operator + (const complex &c1,const complex &c2)  
{  
    return complex(c1.real+c2.real,c1.imag+c2.imag);  
}  
complex operator - (const complex &c1,const complex &c2)  
{  
    return complex(c1.real-c2.real,c1.imag-c2.imag);  
}  
complex operator * (const complex &c1,const complex &c2)  
{  
    return complex(c1.real*c2.real-c1.imag*c2.imag,c1.real*c2.imag+c1.imag*c2.real);  
}  
complex operator / (const complex &c1,const complex &c2)  
{  
    return complex((c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag));  
}  
void print(const complex &c)  
{  
    if(c.imag<0)  
        cout<<c.real<<c.imag<<"i";  
    else  
        cout<<c.real<<"+"<<c.imag<<"i";  
}  
int main()  
{  
    complex c1(2.0),c2(3.0,-1.0),c3;  
    c3=c1+c2;  
    cout<<"\nc1+c2= ";  
    print(c3);  
    c3=c1-c2;  
    cout<<"\nc1-c2= ";  
    print(c3);  
    c3=c1*c2;  
    cout<<"\nc1*c2= ";  
    print(c3);  
    c3=c1/c2;  
    cout<<"\nc1/c2= ";  
    print(c3);  
    c3=(c1+c2)*(c1-c2)*c2/c1;  
    cout<<"\n(c1+c2)*(c1-c2)*c2/c1= ";  
    print(c3);  
    cout<<endl;  
    return 0;  
}  

运行结果:


3.定义一个Time类用来保存时间(时,分,秒),通过重载操作符“+”实现两个时间的相加。(sy7_3.cpp)

#include <stdio.h>  
  class Time  
  {  
  public:  
    Time(){ hours=0;minutes=0;seconds=0;} //无参构造函数  
    Time(int h, int m,int s) //重载构造函数  
    {  
             hours=h; minutes=m; seconds=s;  
    }  
    Time operator +(Time&); //操作符重载为成员函数,返回结果为Time类  
    void gettime();  
  private:  
    int hours,minutes,seconds;  
  };  
  Time Time::operator +(Time& time)  
  {  
  int h,m,s;  
  s=time.seconds+seconds;  
  m=time.minutes+minutes+s/60;  
  h=time.hours+hours+m/60;  
  Time result(h,m%60,s%60);  
  return result;  
  }  
  void Time::gettime()  
  {  
  printf("%d:%d:%d\n",hours,minutes,seconds);  
  }  
  int main( )  
  {  
  Time t1(9,35,45),t2(12,15,32),t3;  
  t3=t1+t2;  
  t3.gettime();  
  return 0;  
  }  

运行结果:


三、分析与讨论
    结合上题中的程序总结运算符重载的形式。
  答:运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、非友元函数重载;但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)  
     当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

     当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。

四、实验小结

    通过本次实验,我们学习了运算符重载的定义和使用方法,当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一个类对象(或者是对该类对象的引用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实验七,运算符重载 的相关文章

  • Android应用的闪退(crash)分析

    文章转自阿里客户端工程师试题简析 Android应用的闪退 crash 分析 1 问题描述 闪退 Crash 是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现 请从crash发生的原因分类与解决方法 在出现crash后如何
  • 人类高质量网格重建算法

    通常对于几何曲面的绘制采用采样描点的方式 比如球的方程为 对于这个方程可以将其改为参数方程 然后对与进行离散化 从而得到一系列的离散点 下面是c 的代码生成一个球 class Sphere public Mesh public Sphere
  • 数字图像隐藏图像的两种算法及实现代码

    数字图像 二值图像 也叫单色图像 是将每个像素点存放在一个bit空间 值为0或者1 的图像 也就是说每个像素 非黑即白 主要用于图像形态学的研究 8位灰度图像 每个像素存放在一个byte空间 8位 0 255 0表示最暗色黑色 255表示最
  • Shell 异常处理

    原创 转载请注明出处 bin bash 服务器执行以下脚本 重新上传脚本到服务器 gt 部署启动的脚本 当任何一行的命令执行错误的时候 比如命令写错了 直接退出 不继续往下执行 function openErrexit set e 当任何一
  • Linux 系统设置开机自动运行脚本的方法

    Linux 系统设置开机自动运行脚本的方法 目录 前言 在工作中 我们经常有个需求 那就是在系统启动之后 自动启动某个脚本或服务 在 Windows 下 我们有很多方法可以设置开机启动 但在 Linux 系统下我们需要如何操作呢 Linux
  • 从功能测试到掌握自动化,四个月时间我是如何从点工进入互联网大厂

    年关了 回望2022年 你的这个2022年收获咋样啦 各大招聘网站 测试工程师月薪一万以上基本都有一个必备技能 那就是自动化测试 那么自动化测试到底难不难呢 下面我将会将我的经历讲给大家听 希望听完后 大家会有自己的一个判断 1 知识体系化
  • 【python】数字图像处理

    目录 基本概念 图像增强 整体代码 线性变换 分段线性变换 对数变换 幂律变换 直方图 图像滤波 平滑图像 锐化图像 基本概念 数字图像定义 对于一幅图像 我们可以将其放入坐标系中 这里取图像左上定点为坐标原点 x 轴向右 和笛卡尔坐标系x
  • caffe 进行手写数字训练

    案例数据准备 下载 链接 https pan baidu com s 10CmpZUdEVmma4A0mziu9dw 提取码 dmjr 复制这段内容后打开百度网盘手机App 操作更方便哦 解压后放到data mnist 进入C Window
  • vs2019登录不上账号怎么办

    别用校园网 用手机热点几分钟就登录上了 惨痛的教训
  • Android APP间跳转

    1 通过包名启动APP 启动方式 只需知道目标APP包名即可 例如 app1 跳转到app2 app2包名为 com demo skipdemo app1启动代码如下 通过目标APP的包名创建intent对象 Intent intent g
  • Hyper-V安装图形化界面

    七 Hyper V安装图形化界面 此处主要需要时间下载界面的安装包 故在此只贴出操作 1 登录 然后键入命令 yum grouplist 可以看到Avilable Environment Groups 中有图形界面GNOME Desktop
  • 求特殊方程的正整数解

    本题要求对任意给定的正整数N 求方程X2 Y2 N的全部正整数解 输入格式 输入在一行中给出正整数N 10000 输出格式 输出方程X2 Y2 N的全部正整数解 其中X Y 每组解占1行 两数字间以1空格分隔 按X的递增顺序输出 如果没有解
  • SpringBoot不同环境加载不同配置文件

    Spring不同环境加载不同配置文件 resource profile 我们在使用spring的时候 一般都会有不同的环境需要部署 开发环境 测试环境和生产环境 而不同的环境则会有不同的配置 比如数据库ip 解决这个问题 我所熟悉的有两种策
  • java中如何将String类型的日期格式为yyyyMMdd转化为date类型的yyyy-MM-dd格式

    今天在做webservice接口服务的时候 xml文件传入的一个节点为人员的出生日期 对应实体类的字段类型为Date类型 获取到的值为String类型 代码如下 获取的值为 19570323 String dateString emp ge
  • jquery之index与selectedIndex

    晚上有时间 继续再写一点 我们来讲一下关于select表单的所有操作 在项目中还是有很多地方需要用到的 讲select之前先讲一下index 的用法 很长时间之前用过一回 熟悉一下还是有用处的 1 index 同级元素的index 获得第一
  • JavaParser入门:以编程方式分析Java代码

    我最喜欢的事情之一是解析代码并对其执行自动操作 因此 我开始为JavaParser做出贡献 并创建了两个相关项目 java symbol solver和Effectivejava 作为JavaParser的贡献者 我反复阅读了一些非常类似的
  • cv2读取视频每10帧保存一张图像

    读取本地mp4视频 每隔10帧保存一张图像到本地 导入所有必要的库 import cv2 import os RootDir Users billiards SaveDir os path join RootDir data 从指定的路径读
  • GICP 配准点云(附python 代码)

    import open3d as o3d import numpy as np import copy def draw registration result src tar transformation source temp copy
  • IP地址分类(A,B,C,D,E类)

    A类的10 0 0 0 10 255 255 255 B类的172 16 0 0 172 31 255 255 C类的192 168 0 0 192 168 255 255为私网IP 除此之外 A B C三类的所有其余IP都是公网IP 或者
  • 记录Python学习 1:列表字符串转数字

    问题 如何将列表 1 2 3 4 5 中的字符串型转化为数值型 通常在使用 lst input split 获得输入时 列表里为字符串型 有时需要进行转换 常用的有两种方法 方法一 利用列表推导式 lst 1 2 3 4 5 lst int

随机推荐

  • android APP调用系统方法

    一般来说 有些系统方法是不提供在 中的 这种情况下 需要把app的源码放到系统源码的目录下编写Android mk进行编译 使其能访问到 hide的系统方法 但是 即使编译通过 在系统中运行的时候 仍然会碰到权限被拒绝的问题 昨天 我在AP
  • 语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖

    文章目录 语句覆盖 判定覆盖 条件覆盖 条件 判定覆盖 组合覆盖 路径覆盖 逻辑覆盖率 语句覆盖 lt 条件覆盖 lt 判定覆盖 lt 条件 判定覆盖 lt 组合覆盖 lt 路径覆盖 语句覆盖 基本思想 设计用例 使程序中的每个可执行语句至
  • DENOISING DIFFUSION IMPLICIT MODELS 论文笔记

    前言 生成模型现在主要分为两类 分别是GAN和Diffusion Model 但是GAN存在一个很棘手的问题就是训练不稳定 这也是Diffusion Model相比之下的优势 DDPM是基于Markovian扩散过程的模型 虽然在生成模型上
  • Java循环结构和DeBug概述

    循环结构 掌握while 循环 先判断在执行 1 循环初始化变量 2 循环条件 3 循环操作 4 循环出口 将循环条件逐渐变为不满足 例图下 do while 循环 先执行在判断 1 声明键盘录入 无论条件是否合格 都会先执行依次循环操作
  • Basic Level 1067 试密码 (20分)

    题目 当你试图登录某个系统却忘了密码时 系统一般只会允许你尝试有限多次 当超出允许次数时 账号就会被锁死 本题就请你实现这个小功能 输入格式 输入在第一行给出一个密码 长度不超过 20 的 不包含空格 Tab 回车的非空字符串 和一个正整数
  • MQTT 消息通信工具使用

    MQTT 介绍 MQTT是机器对机器 M2M 物联网 IoT 连接协议 它被设计为一个极其轻量级的发布 订阅消息传输协议 对于需要较小代码占用空间和 或网络带宽非常宝贵的远程连接非常有用 是专为受限设备和低带宽 高延迟或不可靠的网络而设计
  • Node.js的前世今生,Node.js和npm安装教程

    Node js是目前非常火热的技术 但是它的诞生经历却很奇特 众所周知 在Netscape设计出JavaScript后的短短几个月 JavaScript事实上已经是前端开发的唯一标准 后来 微软通过IE击败了Netscape后一统桌面 结果
  • SpringBoot实战(二十四)集成 LoadBalancer

    目录 一 简介 1 定义 2 取代 Ribbon 3 主要特点与功能 4 LoadBalancer 和 OpenFeign 的关系 二 使用场景一 Eureka LoadBalancer 服务A loadbalancer consumer
  • Qt 集成 FFmpeg 实现颜色格式转换

    目录 1 Qt 集成 FFmpeg 1 1 下载 FFmpeg 1 2 Qt 集成 FFmpeg 1 2 1 修改 pro 文件 1 2 2 放入 dll 文件 1 2 3 代码中使用 FFmpeg 2 图像格式转换 3 预览 4 项目地址
  • 图形学--Transformation

    为什么突然写图形学的东西了呢 当然是学校要上这门课 摊 2D Transformation scale 缩放 其中这个对角矩阵是缩放矩阵 Reflection 反转 Shear 切变 Roatate 旋转 默认绕原点旋转 逆时针 旋转 角是
  • Android 使用ViewPager创建导航页(最简单方法,不服来辩)

    要说写一个APP最先要写的是什么 那肯定是导航页了 导航页怎么实现呢 这里介绍其中一种使用方法ViewPager 好了废话不多说 一 VIewPager是什么 ViewPager继承自ViewGroup 是一个View容器 用于装载多个Vi
  • 网络编程学习笔记(基础)

    序言 这个博客有点 胡吃海喝 的味道 所写虚于所实哈 笔记记的是一个B站up主的 目录 TCP 双向的沟通 双向奔赴 gt 稳定 UDP 单向的沟通 单相思 gt 发送 网络编程的作用 网络编程的重点在于 联机 单机游戏和联机游戏的区分 网
  • R从文件中读取数据,输出文件

    看了几天的书 终于到这一步了 说实话 用R来做统计 很少有人手动的去输入那些数字 肯定是从别的地方导入的 我们用来处理就可以了 所以到这里才算是真正的入门 前面都是做基础的练手 我学习R从 R语言与统计分析 入手 第一个例子 从书上的例子
  • window消息,窗口学习笔记

    线程和窗口的关系 如上图在 点击了窗口后 int a 100 这条语句不会执行 知道把窗口关闭掉才会执行 如果把SendMessage函数改为PostMessage函数 则直接会执行到这条语句
  • java代码对比工具_代码比较工具(Diffuse)

    支持命令行提示和一个基于GUI的窗口工具包 他在命令行中的速度是相当快的 支持像 C Python Java XML 等语言的语法高亮显示 可视化比较 非常直观 支持两相比较和三相比较 这就是说 使用 Diffuse 你可以同时比较两个或三
  • ChatGPT 太贵?一键部署自己的私有大模型

    部署你的私有化对话机器人 只需要三步 克隆 github 中文版 LLaMa repo 下载 HuggingFace 13B 16K 完整模型 启动对话窗口 没错 就是这么简单 我把这份操作指南 做成了一份 Jupyter Notebook
  • 遗传算法(GA)优化BP神经网络分类预测,GA-BP分类预测,多特征输入模型。多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据集 xlsx 划分训练集和测试集 P train res 1 250 1
  • 萤火学堂视频:硬件设计-PCB原理图简要讲解

    萤火学堂 视频 硬件设计 PCB原理图简要讲解 https v youku com v show id XNDY0MTYyNDk4NA 3D 3D html
  • java 批量查询es_java操作ES的简单查询和bool查询

    导入包 org elasticsearch client transport 5 2 2 org apache logging log4j log4j api 2 7 org apache logging log4j log4j core
  • 实验七,运算符重载

    一 实验目的和要求 熟悉运算符重载的定义和使用方法 二 实验内容 1 调试下列程序 sy7 1 cpp include