面向对象实验 ——(一)控制结构与函数

简介: 面向对象实验 ——(一)控制结构与函数

一、实验内容及要求

内容:

(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;
}

运行结果:

20200401134307494.png

结果分析:

大体分析一下执行流程~

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点坐标未被更新。




目录
相关文章
|
5月前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
64 7
|
5月前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
33 0
|
5月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
47 0
|
存储 程序员 编译器
编程基础:数据类型、变量与控制结构
编程基础:数据类型、变量与控制结构
88 0
|
6月前
第七章 用函数实现模块化程序设计
第七章 用函数实现模块化程序设计
22 0
|
6月前
|
Serverless 开发者 Python
Python函数式编程:从概念到应用的完整指南
在 Python 中,函数式编程是一种流行且强大的编程范式,它不仅可以使代码更加简洁、优雅,而且还能提高程序的可读性和可维护性。本文将从基础概念入手,详细讲解 Python 函数式编程的核心思想、常用函数和实际应用。无论你是 Python 新手还是经验丰富的开发者,本文都能为你提供全面的参考和指导。
|
6月前
|
算法 C语言
第五章:循环结构程序设计(完全体)
第五章:循环结构程序设计(完全体)
159 0
第五章:循环结构程序设计(完全体)
|
程序员 编译器 C#
C#OOP之三 控制结构
C#OOP之三 控制结构
65 0
|
编译器 数据安全/隐私保护 Python
Python编程基础:实验1——程序的控制结构
Python编程基础实验1——程序的控制结构
424 0
Python编程基础:实验1——程序的控制结构
|
算法 编译器 项目管理
程序设计学习方法 2022-08-20 26
简介: 程序设计学习有确定的知识范畴和技能范畴,有实现能力和素质提升的客观规律,有科学认知和实践操作方法。需要,目标,关键指标,检查评估,提升应用,哲学思考,观念价值观等都是最终目标。 最低要求和最高要求,也是可以参考的。
70 0
下一篇
无影云桌面