c++第二次作业
1.为什么要用函数
在第一节,我们已经知道使用工具的好处,即可以重复使用和在各种适用情况下使用。函数和工具一样具有这些好处。但是除此以外,函数的存在还有着其他的意义。 一、现在要设计一个“学生信息处理程序”,需要完成四项工作,分别是记录学生的基本情况、学生成绩统计、优秀学生情况统计和信息输出。如果我们把四项工作全都写在主函数里面,那么我们就很难分清那一段代码在做什么。多层次的缩进和不能重复的变量名给我们阅读程序带来了困难。 如果我们为每一个功能编写一个函数,那么根据函数名每个函数的功能就很清晰了。如果我们要修改某一个函数的功能,其他的函数也丝毫不会受到影响。所以,函数的存在增强了程序的可读性。 二、需要设计一个规模很大的程序,它有几千项功能,把这些功能都编写在一个主函数里就只能由一个人来编写,因为每个人解决问题的思路是不同的,而且在主函数中的变量名是不能重复的,只有编写者自己知道哪些变量名是可以使用的。这样一来,没有一年半载,这个程序是无法完成的。 如果我们把这几千项功能分拆为一些函数,分给几百个人去编写,那么用不了几天时间这些函数就都能够完成了。最后用主函数把这些完成的函数组织一下,一个程序很快就完工了。所以,函数能够提高团队开发的效率。它就像把各个常用而不相关联的功能做成一块块“积木”。完成了函数的编写,编程就像搭积木一样方便了。 三、程序会占用一定的内存用来存放数据。如果没有函数,那么在程序的任何一个地方都能够访问或修改这些数据。这种数据的非正常改变对程序的运行是有害的,给调试程序也会带来很多麻烦。 如果我们把若干项功能分拆为函数,则只要把函数原型提供出来就可以了,不需要将数据提供出来。一般情况下,别的函数无法修改本函数内的数据,而函数的实现方法对外也是保密的。我们把这种特性称为函数的黑盒特性。 我们认识到一个程序中需要有函数存在,于是一个更完整的程序结构出现了。
-
创建对象时,自动调用构造函数,不能在程序中直接调用,可有任意类型参数,但不能有返回类型;
-
构造函数作用:为对象分配空间、为数据成员赋初值、请求其他资源;
-
构造函数工作:初始化虚函数表、建立基类对象、建立非静态数据成员对象、安置虚基类对象信息、执行构造函数体中的代码;
-
若一个类中没有定义构造函数,编译器会自动生成不带参数的默认构造函数,格式为:
<类名>::<默认构造函数名>() { }
-
析构函数作用:清除对象、释放内存;
-
析构函数工作:执行析构函数中的代码、将对象占据的存储空间归还系统、做公共及用户要求的善后工作;
-
析构函数无参数和返回值,一个类中只能定义一个析构函数,故不能重载,格式为:
~<类名>();
2:为什么用函数重载
函数重载和运算符重载是简单一类多态性,所谓函数重载简单地说就是赋给同一个函数名多个含义。具体地讲,C++中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是成员函数,也可以是非成员函数。但是,定义这种重载函数时要求函数的参数或者至少有一个类型不同,或者个数不同。而对于返回值的类型没有要求,可以相同,也可以不同。那种参数个数和类型都相同,仅仅返回值不同的重载函数是非法的。因为编译程序在选择相同名字的重载函数时仅考虑函数表,这就是说要靠函数的参数表中,参数个数或参数类型的差异进行选择。
-
重载为类的成员函数,参数个数比原来的运算数少一个
<函数类型> operator <运算符> (<形参列表>) { <函数体>; }
-
重载为类的友元函数,参数个数与原运算数个数一样多;
friend <函数类型> operator <运算符> (<形参列表>) { <函数体>; }
-
函数重载:返回值类型可以相同可以不同,但形参列表一定不同;
3:值传递与地址传递
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
例如:
#include "iostream.h"
void swap(int,int);
void main()
{
int a=3,b=4;
cout<<"a="< < swap(a,b);
cout<<"a="< <}
void swap(int x,int y)
{
int t=x;
x=y;
y=t;
}
此程序的运行结果为:
a=3,b=4
a=3,b=4
指针(地址)传递: 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
例如:
include "iostream.h"
void swap(int *,int *);
void main()
{
int a=3,b=4;
cout<<"a="< < swap(&a,&b);
cout<<"a="< <}
void swap(int *x,int y)
{
int t=x;
x=y;
*y=t;
}
此程序的运行结果为:
a=3,b=4
a=4,b=3
4:分析如何编写递归函数
用递归的方法编写函数计算X的Y次方的值,观察递归调用的过程
#include
using namespace std;
void main()
{
int n;
float y,x;
int power(int x,int n);
cout<<"please iuput x,n=";
cin>>x>>n;
y=power(x,n);
cout<<"y="<<y<<endl;
}
int power(int x,int n)
{
float t=1.0;
if(n==1)
t=x;
else
t=x*power(x,n-1);
return(t);
}