zoukankan      html  css  js  c++  java
  • 面向对象实验 ——(一)控制结构与函数

    一、实验内容及要求

    内容:
    (1)熟悉Visual Studio 2010开发环境,掌握C++中有关数据类型、输入输出、程序控制流的基本知识;
    (2)函数的定义、函数参数传递;函数的重载;
    (3)函数形参的缺省值设置。
    要求:
    (1)理解函数定义及对数据的处理流程;
    (2)掌握函数参数传递的原理、函数重载、缺省值形参函数的使用;
    (3)以简单类型数据的处理为例,设计一个具有一定功能的函数,要求用到上述语法机制;
    (4)记录并分析实验结果,撰写实验报告。

    二、实验过程及实验结果分析

    1.C++数据类型 输入输出 程序控制流
    数据类型与C语言没有多大差异,可以用typedef对已经存在的类型进行重新命名。
    C++中的输入输出是通过I/O流来进行的。
    2.函数的定义和函数的调用
    经过C语言的学习,我们已经对函数有了一个初步的了解:比如函数分为库函数和用户定义函数,函数的定义的语法等等。
    现在我们先回顾一下函数的调用过程:(1).记录返回地址 (2).为被调函数的执行分配资源,创造运行条件(3).将控制交给被调函数执行。
    3.函数参数的传递:
    函数在进行参数传递时,有两种方式,传值调用和传引用调用,这两种方式的区别就在于第二步资源的分配。前者会为实参数据在被调函数内部生成数据副本,后者是直接操作主调函数被的原始数据。
    4.函数重载:
    简单的介绍就是“同名可区分”。
    对于多个名称相同的函数,如果能够通过参数个数和类型对函数进行区分,就可以使用这些函数,称为函数重载。
    需要注意的是,函数重载必须要有可以区分的地方,否则编译错误。
    5.函数形参的缺省值设置。
    一般情况下,在函数调用时,实参个数应当与形参个数相同,并且类型一致,否则会编译错误。但是我们也可以在定义函数时,为一个或多个形参指定默认值,这样的话调用时如果给出实参,则使用实参,否则就使用预先给出的默认参数值。
    当进行函数调用时,编译器会按照从左到右的顺序将实参与形参结合,若为指定实参,则编译器会按照顺序将函数原型中的默认值来补足所默认的实参。

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    struct node{
        int x,y;
    };
    
    ///计算两个点之间的曼哈顿距离
    void dis(node a,node b){
        cout<<"a点的坐标是:"<<"x="<<a.x<<" "<<"y="<<a.y<<endl;
        cout<<"b点的坐标是:"<<"x="<<b.x<<" "<<"y="<<b.y<<endl;
        cout<<"a、b两点的曼哈顿距离是:"<<endl;
        cout<<abs(a.x-b.x)+abs(a.y-b.y)<<endl;
    }
    
    ///计算该点与原点的曼哈顿距离
    void dis(int x1,int y1,int x2=0,int y2=0){///后两个为默认形参
        cout<<"a点的坐标是:"<<"x="<<x1<<" "<<"y="<<y1<<endl;
        cout<<"a点与原点的曼哈顿距离是:"<<endl;
        cout<<abs(x1-x2)+abs(y1-y2)<<endl;
    }
    
    void update1(node &a){///传引用调用,直接在原数据上进行操作
        a.x++,a.y++;
    }
    
    void update2(node b){///传值调用,操作的是生成的数据副本
        b.x++,b.y++;
    }
    
    int main(){
        node a={1,2};///定义a点坐标
        node b={3,4};///定义b点坐标
    
        dis(a,b);
        puts("");
    /**
    调用函数dis的过程:1.记录返回地址34行 2.为dis函数的调用分配资源 3.将控制交给被调函数执行
    **/
        dis(1,2);
        puts("");
    /**
    第33行和第38行的两个dis函数同名,但是由于参数类型不同,所以编译器可以根据不同的参数选择执行哪一个,这就是函数重载
    **/
    
        update1(a);
        cout<<"移动后的a点坐标为:"<<"x="<<a.x<<" "<<"y="<<a.y<<endl;
        update2(b);
        cout<<"移动后的b点坐标为:"<<"x="<<b.x<<" "<<"y="<<b.y<<endl;
    /**
    函数参数传递有传值调用和传引用调用两种类型,前者会生成数据副本,不会改变原数据的值
    后者则直接对原数据进行操作,会改变原数据的值
    **/
    
        return 0;
    }
    

    运行结果:

    在这里插入图片描述

    结果分析:

    大体分析一下执行流程~
    1.进行a,b两点坐标的初始化
    2.调用函数dis计算a,b两点之间的曼哈顿距离
    (1)记录返回地址 第34行
    (2)为dis函数的调用分配资源
    (3)将控制交给dis函数执行
    (4)计算出a,b两点之间的曼哈顿距离并进行相应的输出
    (5)返回主调函数中记录的返回地址
    3.调用dis函数计算a到原点的曼哈顿距离,其中因为函数参数类型的不同,编译器可以区分这两个重载的dis函数,具体执行流程与2类似
    4.调用update1函数移动a点,因为是update1函数是传引用调用,所以可以直接更改原始数据,输出后发现a点坐标已经更新。
    5.调用update2函数移动b点,因为update2函数是传值调用,调用时会根据原始数据生成新的数据副本,对数据副本进行操作,并不会对原始数据产生影响,所以b点坐标未被更新。

  • 相关阅读:
    (转)使用 PyInstaller 把python程序 .py转为 .exe 可执行程序
    (转)使用 python Matplotlib 库绘图
    使用Matplotlib画图系列(一)
    Numpy常用金融计算(一)
    Windows中安装Linux子系统的详细步骤
    Centos7+Postfix+Dovecot实现内网邮件收发 风行天下
    centos7系统防火墙端口转发 风行天下
    Centos7+Postfix+Dovecot实现内网邮件收发
    centos7的路径含有空格Linux命令使用时路径存在空格、特殊符号(如、@等等) 风行天下
    zabbix无法使用Detect operating system [zabbix] 风行天下
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853124.html
Copyright © 2011-2022 走看看