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);

}

转载于:https://www.cnblogs.com/liangtingyu/p/11529112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值