燕山大学-面向对象程序设计实验-实验7 多态性:函数与运算符重载-实验报告

CSDN的各位友友们你们好,今天千泽为大家带来的是
燕山大学-面向对象程序设计实验-实验5 派生与继承:单重派生-实验报告,
接下来让我们一起进入c++的神奇小世界吧,相信看完你也能写出自己的 实验报告!
本系列文章收录在专栏 燕山大学面向对象设计报告中 ,您可以在专栏中找到其他章节
如果对您有帮助的话希望能够得到您的支持和关注,我会持续更新的!

实验七 多态性—函数与运算符重载

💎7.1 实验目的

1.理解动态联编和动态联编的概念;

2.理解掌握成员函数方式运算符重载;

3.理解掌握友元函数方式运算符重载;

4.理解掌握++、--、=运算符的重载。

💎7.2 实验内容

7.2.1程序阅读

💎1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include "iostream"

class CComplex

{

public:

       CComplex()

       {

              real = 0;

              imag = 0;

       }

       CComplex(int x,int y)

       {

              real = x;

              imag = y;

       }

      

       int real;

       int imag;

      

       CComplex operator + (CComplex obj1)-----------------------------------------------①

       {

              CComplex obj2(real + obj1.real, imag + obj1.imag);

              return obj2;

       }

};

void main()

{

       CComplex obj1(100,30);

       CComplex obj2(20, 30);

       CComplex obj;

       obj = obj1+obj2; ------------------------------------------------------------------②

       cout << obj.real <<endl;

       cout << obj.imag << endl;

}

问题一:①处的运算符重载,为什么该函数的返回值要设计成CComplex类型?

答:①处重载加法运算符,两个CComplex型数据相加后,仍然为CComplex型,相加不改变数据类型,故仍返回CComplex类型。

问题二:②处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);”,但是为什么CComplex类中的运算符重载函数只设计了一个参数?

答:运算符重载是一个成员函数,本身就可以获取到自身,而自身就相当于obj1,故只需要再设计一个参数给obj2即可。

💎2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include "iostream"

class CComplex

{

public:

       CComplex()

       {

              real = 0.0;

              imag = 0.0;

       }

       CComplex(float x, float y)

       {

              real = x;

              imag = y;

       }

       CComplex operator + (CComplex &obj1, CComplex &obj2)

       {

              CComplex obj3(obj1.real + obj2.real, obj1.imag + obj2.imag);

              return obj3;

       }

       CComplex &operator++(CComplex &obj)

       {

              obj.real += 1;

              obj.imag +=1;

              return obj;

       }

       void print()

       {

              cout<<real<<"+"<<imag<<"i"<<endl;

       }

private:

       float real;

       float imag;

};

CComplex &operator--(CComplex &x)

{

       x.real -= 1;

       x.imag -= 1;

       return x;

}

void main()

{

       CComplex obj1(2.1,3.2);

       CComplex obj2(3.6,2.5);

       cout<<"obj1=";

       obj1.print();

       cout<<"obj2=";

       obj2.print();

       CComplex obj3 = obj1 + obj2;

       cout<<"befor++, obj3=";

       obj3.print();

       ++obj3;

       cout<<"after++, obj3=";

       obj3.print();

       --obj3;

       cout<<"after--, obj3=";

       obj3.print();

       CComplex obj4 = ++obj3;

       cout<<"obj4=";

       obj4.print();

}

问题一:以上程序中的三个运算符重载都有错误,试改正过来,并分析该程序的输出结果。

答:修改后代码如下

#include <iostream>
 
using namespace std;
 
 
 
class CComplex{
 
    public:
 
        CComplex(){
 
            real = 0.0;
 
            imag = 0.0;
 
        }
 
        CComplex(float x, float y){
 
            real = x;
 
            imag = y;
 
        }
 
        CComplex operator + (CComplex &obj2){//重载加法运算符只需要额外加一个参数
 
            CComplex obj3(real + obj2.real,imag + obj2.imag);
 
            return obj3;
 
        }
 
        CComplex& operator++(){//重载++运算符括号里为空 
 
            real += 1;
 
            imag +=1;
 
            return *this;
 
        }
 
        CComplex& operator--(){//作为成员函数,放在类内
 
            real -= 1;
 
            imag -= 1;
 
            return *this;
 
        }
 
        void print(){
 
            cout<<real<<"+"<<imag<<"i"<<endl;
 
        }
 
    private:
 
        float real;
 
        float imag;
 
};
 
 
 
int main(){
 
    CComplex obj1(2.1,3.2);
 
    CComplex obj2(3.6,2.5);
 
    cout<<"obj1=";
 
    obj1.print();
 
    cout<<"obj2=";
 
    obj2.print();
 
    CComplex obj3 = obj1 + obj2;
 
    cout<<"befor++, obj3=";
 
    obj3.print();
 
    ++obj3;
 
    cout<<"after++, obj3=";
 
    obj3.print();
 
    --obj3;
 
    cout<<"after--, obj3=";
 
    obj3.print();
 
    CComplex obj4 = ++obj3;
 
    cout<<"obj4=";
 
    obj4.print();
 
    return 0;
 
}
分析:
初始状态,构造obj1=2.1+3.2i,obj2=3.6+2.5i,正常输出
运行obj3=obj1+obj2,重载+运算符,实部real和虚部imag分别相加,输出obj3=5.7+5.7i
运行++obj3,重载前置++运算符,实部real和虚部imag分别自增,输出obj3=6.7+6.7i
运行—obj3,重载前置—运算符,实部real和虚部imag分别自减,输出obj3=5.7+5.7i
运行obj4=++obj3,即先令++obj3,obj3=6.7+6.7i,随后令obj4=obj3=6.7+6.7i,正常输出obj4

💎7.2.2 程序设计

1.把7.2.1中第一道题的程序改造成采取友元函数重载方式来实现“+”运算符,并采取友元函数重载方式增加前置和后置“++”以及“--”运算符重载,并设计主函数来验证重载运算符的用法。

答:

#include <iostream>
 
using namespace std;
 
 
 
class CComplex{
 
    public:
 
        CComplex(){
 
            real = 0;
 
            imag = 0;
 
        }
 
        CComplex(int x,int y){
 
            real = x;
 
            imag = y;
 
        }
 
       
 
        int real;
 
        int imag;
 
       
 
        friend CComplex operator + (CComplex& obj1,CComplex& obj2);
 
        friend CComplex &operator++(CComplex &obj);
 
        friend CComplex &operator--(CComplex &obj);
 
        friend CComplex &operator++(CComplex &obj,int);
 
        friend CComplex &operator--(CComplex &obj,int);
 
};
 
 
 
CComplex operator + (CComplex& obj1,CComplex& obj2){
 
    CComplex obj3(obj1.real + obj2.real, obj1.imag + obj2.imag);
 
    return obj3;
 
}
 
 
 
CComplex &operator++(CComplex &obj){
 
    obj.real += 1;
 
    obj.imag += 1;
 
    return obj;
 
}
 
 
 
CComplex &operator--(CComplex &obj){
 
    obj.real -= 1;
 
    obj.imag -= 1;
 
    return obj;
 
}
 
 
 
CComplex &operator++(CComplex &obj,int){
 
    CComplex tmp=obj;
 
    obj.real += 1;
 
    obj.imag += 1;
 
    return tmp;
 
}
 
 
 
CComplex &operator--(CComplex &obj,int){
 
    CComplex tmp=obj;
 
    obj.real -= 1;
 
    obj.imag -= 1;
 
    return tmp;
 
}
 
 
 
int main(){
 
    CComplex obj1(2,3);
 
    CComplex obj2(3,2);
 
    cout<<"obj1="<<obj1.real<<"+"<<obj1.imag<<"i"<<endl;
 
    cout<<"obj2="<<obj2.real<<"+"<<obj2.imag<<"i"<<endl;
 
    CComplex obj3 = obj1 + obj2;
 
    cout<<"obj3=obj1+obj2=";
 
    cout<<obj3.real<<"+"<<obj3.imag<<"i"<<endl;
 
    ++obj3;
 
    cout<<"前置++,";
 
    cout<<"obj3="<<obj3.real<<"+"<<obj3.imag<<"i"<<endl;
 
    --obj3;
 
    cout<<"前置--,";
 
    cout<<"obj3="<<obj3.real<<"+"<<obj3.imag<<"i"<<endl;
 
    CComplex obj4 = ++obj3;
 
    cout<<"obj4=++obj3="<<obj4.real<<"+"<<obj4.imag<<"i"<<endl;
 
   
 
    obj3++;
 
    cout<<"后置++,";
 
    cout<<"obj3="<<obj3.real<<"+"<<obj3.imag<<"i"<<endl;
 
    obj3--;
 
    cout<<"后置--,";
 
    cout<<"obj3="<<obj3.real<<"+"<<obj3.imag<<"i"<<endl;
 
    obj4 = obj3++;
 
    cout<<"obj4=obj3++="<<obj4.real<<"+"<<obj4.imag<<"i"<<endl;
 
   
 
    return 0;
 
}

💎7.3思考题

1.定义CPoint类,有两个成员变量:横坐标(x)和纵坐标(y),对CPoint类重载“++”(自增运算符)、“--”(自减运算符),实现对坐标值的改变。(每个函数均采用友元禾成员函数实现)

答:

(友元函数实现)
 
#include<iostream>
 
using namespace std;
 
 
 
class CPoint{
 
    private:
 
        double x;
 
        double y;
 
    public:
 
        CPoint(double x,double y):x(x),y(y)
 
        {
 
        }
 
        void print(){
 
            cout<<"坐标为("<<x<<","<<y<<")"<<endl;
 
        }
 
        friend CPoint &operator++(CPoint &obj);
 
        friend CPoint &operator--(CPoint &obj);
 
        friend CPoint &operator++(CPoint &obj,int);
 
        friend CPoint &operator--(CPoint &obj,int);
 
 
 
};
 
 
 
CPoint &operator++(CPoint &obj){
 
    obj.x += 1;
 
    obj.y += 1;
 
    return obj;
 
}
 
 
 
CPoint &operator--(CPoint &obj){
 
    obj.x -= 1;
 
    obj.y -= 1;
 
    return obj;
 
}
 
 
 
CPoint &operator++(CPoint &obj,int){
 
    CPoint tmp=obj;
 
    obj.x += 1;
 
    obj.y += 1;
 
    return tmp;
 
}
 
 
 
CPoint &operator--(CPoint &obj,int){
 
    CPoint tmp=obj;
 
    obj.x -= 1;
 
    obj.y -= 1;
 
    return tmp;
 
}
 
 
 
int main(){
 
    CPoint a(2.5,5.2);
 
    a.print();
 
 
 
    cout<<"a++";
 
    (a++).print();
 
    cout<<"++后a";
 
    a.print();
 
   
 
    cout<<"a--";
 
    (a--).print();
 
    cout<<"--后a";
 
    a.print();
 
   
 
    cout<<"++a";
 
    (++a).print();
 
    cout<<"++后a";
 
    a.print();
 
   
 
    cout<<"--a";
 
    (--a).print();
 
    cout<<"--后a";
 
    a.print();
 
   
 
    return 0;
 
}

本篇文章就分享到这里啦,祝你学习进步!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言进阶】内存函数

天生我材必有用&#xff0c;千金散尽还复来。 ——李白 目录 前言 一.memcpy函数 ​1.实现memcpy函数 2.模拟实现memcpy函数 二.memmove函数 1.实现memmove函数 2.模拟实现memmove函数 三.memcpy函数和memmove函数的关系 四.memcm…

2023金三银四--我们遇到的那些软件测试面试题【功能/接口/自动化/性能等等】

一、面试技巧题(主观题) 序号面试题1怎么能在技术没有那么合格的前提下给面试官留个好印象&#xff1f;2面试时&#xff0c;如何巧妙地避开不会的问题&#xff1f;面试遇到自己不会的问题如何机智的接话&#xff0c;化被动为主动&#xff1f;3对于了解程度的技能&#xff0c;被…

【Docker】什么是Docker?Docker的安装、加速

文章目录Docker出现的背景解决问题docker理念容器与虚拟机比较容器发展简史传统虚拟机技术容器虚拟化技术Docker安装官方网站安装前提Docker的基本组成镜像容器仓库Docker平台架构图解CentOS7安装Docker确定你是CentOS7及以上版本卸载旧版本yum安装gcc相关安装需要的软件包设置…

用 ChatGPT 辅助学好机器学习

文章目录一、前言二、主要内容&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 探索更高效的学习方法可能是有志者共同的追求&#xff0c;用好 ChatGPT&#xff0c;先行于未来。 作为一个人工智能大语言模型&#xff0c;ChatGPT 可以在帮助初…

Pandas 与 PySpark 强强联手,功能与速度齐飞

Pandas做数据处理可以说是yyds&#xff01;而它的缺点也是非常明显&#xff0c;Pandas 只能单机处理&#xff0c;它不能随数据量线性伸缩。例如&#xff0c;如果 pandas 试图读取的数据集大于一台机器的可用内存&#xff0c;则会因内存不足而失败。 另外 pandas 在处理大型数据…

Linux分文件编程:静态库与动态库的生成和使用

目录 一&#xff0c;Linux库引入之分文件编程 ① 简单说明 ② 分文件编程优点 ③ 操作逻辑 ④ 代码实现说明 二&#xff0c;Linux库的基本说明 三&#xff0c;Linux库之静态库的生成与使用 ① 静态库命名规则 ② 静态库制作步骤 ③ 静态库的使用 四&#xff0c;Linu…

django-celery-beat搭建定时任务

一、创建django项目和app 1、安装定时任务第三方包 pip install django-celery-beat # 插件用来动态配置定时任务,一般会配合 django_celery_results 一起使用&#xff0c;所以一起安装 django_celery_results pip install django_celery_results pip install eventlet # win…

Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)

注&#xff1a;这个是MDK6&#xff0c;不是MDK5 AC6&#xff0c;属于下一代MDK视频版&#xff1a; https://www.bilibili.com/video/BV16s4y157WF Keil MDK6要来了&#xff0c;将嵌入式软件开发水平带到新高度&#xff0c;支持跨平台一年一度的全球顶级嵌入式会展Embedded Wor…

操作系统(1.3)--习题

一、课堂习题 1、一个作业第一 次执行时用了5min ,而第二次执行时用了6min,这说明了操作系统的( )特点。 A、并发性 B、共享性 C、虚拟性 D、不确定性 D 2、在计算机系统中,操作系统是( )。 A、处于裸机之上的第一层软件 B、处于硬件之下的低层软件 C、处于应用软件之上的系统软…

对象的创建以及数组中常见的属性与方法

&#xff08;一&#xff09;对象创建的三种方法 1、利用对象字面量创建对象 const obj{ name:小开心 } 2、利用new Object创建对象 const obj1new Object({ name:小开心 }) 3、利用构造函数创建对象 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要用来初始化对象&…

Vector的扩容机制

到需要扩容的时候&#xff0c;Vector会根据需要的大小&#xff0c;创建一个新数组&#xff0c;然后把旧数组的元素复制进新数组。 我们可以看到&#xff0c;扩容后&#xff0c;其实是一个新数组&#xff0c;内部元素的地址已经改变了。所以扩容之后&#xff0c;原先的迭代器会…

【Spring事务】声明式事务 使用详解

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 声明式事务一、编程式事务二、声明式事务&…

PMSM矢量控制笔记(1.1)——电机的机械结构与运行原理

前言&#xff1a;重新整理以前的知识和文章发现&#xff0c;仍然有许多地方没有学得明白&#xff0c;懵懵懂懂含含糊糊的地方多如牛毛&#xff0c;尤其是到了真正实际写东西或者做项目时&#xff0c;如果不是系统的学习了知识&#xff0c;很容易遇到问题就卡壳&#xff0c;也想…

C语言的灵魂---指针(基础)

C语言灵魂指针1.什么是指针&#xff1f;2.指针的大小3.指针的分类3.1比较常规的指针类型3.2指针的解引用操作3.3野指针野指针的成因&#xff1a;4.指针运算4.1指针加减整数4.2指针-指针1.什么是指针&#xff1f; 这个问题我们通常解释为两种情况&#xff1a; 1.指针本质&#…

Unity学习日记13(画布相关)

目录 创建画布 对画布的目标图片进行射线检测 拉锚点 UI文本框使用 按钮 按钮导航 按钮触发事件 输入框 实现单选框 下拉菜单 多选框选项加图片 创建画布 渲染模式 第一个&#xff0c;保持画布在最前方&#xff0c;画布内的内容显示优先级最高。 第二个&#xff0c;…

GitHub 上有些什么好玩的项目?

前言 各个领域模块的都整理了一下&#xff0c;包含游戏、一些沙雕的工具、实用正经的工具以及一些相关的电商项目&#xff0c;希望他们可以给你学习的路上增加几分的乐趣&#xff0c;我们直接进入正题~ 游戏 1.吃豆人 一款经典的游戏开发案例&#xff0c;包括地图绘制、玩家控…

并发基础之线程池(Thread Pool)

目录前言何为线程池线程池优势创建线程池方式直接实例化ThreadPoolExecutor类JUC Executors 创建线程池线程池挖掘Executors简单介绍ThreadPoolExecutor核心类ThreadPoolExecutor 类构造参数含义线程池运行规则线程设置数量结语前言 相信大家都知道当前的很多系统架构都要求高…

echart图表之highcharts

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、HighCharts是什么&#xff1f;二、使用步骤1.引入库2.前端代码3.展现结果4.后台自动截图总结前言 提示&#xff1a;这里可以添加本文要记录的大概内容&…

linux kernel 5.0 inline hook框架

github:https://github.com/WeiJiLab/kernel-hook-framework 一、项目介绍 Usually we want to hack a kernel function, to insert customized code before or after a certain kernel function been called, or to totally replace a function with new one. How can we…

计算机图形学11:二维观察之多边形的裁剪

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、多边形的裁剪…