一、实验内容及要求
内容:
(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点坐标未被更新。