C++(四):函数

四、函数

函数的使用

以一个求阶乘的函数为例讲述如何编写和使用函数。

1.头文件,函数的声明

我们提倡 分离式编译 (separate compilation) ,因此我们会将程序分割到数个文件中。头文件包含了该函数的声明。

#ifndef FACT_H
#define FACT_H
#include <iostream>

using namespace std;

unsigned int fact(int a);
#endif

fact.h是我们定义的头文件的名称。其中ifndef和endif语句块是一种预处理机制,防止重复包含头文件带来的潜在危害。

在头文件中需要包含哪些库是视其所生命的函数而定的,在这里只用到了一些iostream的内容,因此只include它一个。

在这个头文件中我们声明了一个会返回unsigned int类型的、名称为fact,形参为一个整型变量的函数。在此处仅仅是声明,并不设计该函数的具体实现。

将函数的声明直接放在使用该函数的源文件中也是合法的,但是这么做也许会很繁琐并且容易出错。如果将函数的声明放在头文件中,既能保证同意函数的所有声明保持一致,在将来万一我们想要修改函数的接口也会更加的方便。

2.源文件,函数的定义

在这个例子中,函数的定义如下:

#include "fact.h"
unsigned int fact(int a)
{
   
	unsigned int temp = 1;
	while (a > 1)
	{
   
		temp *= a--;
	}
	return temp;
}

首先,为了将源文件与头文件关联起来,我们必须将含有函数声明的头文件包含进定义函数的源文件中,即第一行 include 语句。

随后我们开始定义这个计算阶乘的函数。它的返回,函数名,形参与头文件中一致,大括号内是函数体,涉及到函数的具体实现,最后返回了一个temp,其类型必须与函数的返回类型一致。

3.主程序,函数的调用

#include "fact.h"
using namespace std;


int main()
{
   
	int a = 0;
	cin >> a;
	cout << fact(a) << endl;
	return 0;
}

要调用fact函数,必须先在源文件中include声明其的头文件。

我们用调用运算符() 来执行函数。函数的调用完成两项工作:一是用实参初始化函数的形参,二是将控制权转移给被调用函数。

用实参初始化函数的形参是指程序会首先创建一个名字为a的int变量,并用调用运算符内的实参初始化这个变量。该变量的生命周期仅在fact函数被调用期间,一旦函数执行结束,该变量就会被“销毁”。

参数传递

1.值传递

如上文所示的程序,主函数中定义的变量 a 的值被拷贝后传递给了fact函数中的形参 a ,在这种情况下形参和实参是两个相互独立的对象,这样的传递方式称为 值传递

当初始化一个非引用类型的变量时,初始值被拷贝给变量,此时对变量的改动不会影响初始值。

unsigned int fact(int a)
{
   
	unsigned int temp = 1;
	while (a > 1)
	{
   
		temp *= a--;
	}
	return temp;
}
int main()
{
   
	int a = 0;
	cin >> a;
	cout << fact(a) << endl;
	cout << a << endl;
	return 0;
}

现在分析:虽然在fact中我们对形参a做了更改:a-- ,但是如同上文所说,在值传递的情况下程序是通过建立副本的方式实现功能的,因此主函数中的变量a并没有被改变。

在这里插入图片描述

2.引用传递

当形参是引用类型的时候,这时的实参被 引用传递 了。此时的形参被绑在了对应的实参上,也就是说我们可以通过形参更改实参的值。

void reset(int &i)
{
   
	i = 0;
}
int main()
{
   
	int a = 10;
	reset(a);
	cout << a << endl;
	return 0;
}

根据值传递的结论,倘若reset的形参为非引用类型,则这段代码打印出来的值应该是10。实际上由于在这里使用了引用形参,因此改变 i 的值就是改变了 a 的值。

在这里插入图片描述
由于拷贝大的类类型对象和容器是比较低效的行为,甚至有的类不支持拷贝操作,因此建议在这种情况使用引用形参访问该类型对象。

一个实例:

#include "bubblesort.h"

void bubblesort(int (&r)[10])
{
   
	for (int i = 0; i != 9; ++i)
	{
   
		for (int j = 0; j != 10 - i - 1; ++j)
		{
   
			int temp;
			if ( r[j] > r[j + 1])
			{
   
				temp = r[j];
				r[j] = r[j + 1];
				r[j + 1] = temp;
			}
		}
	}
}

#include "bubblesort.h"
int main()
{
   
	int arr[] = {
   1,10,2,7,9,4,6,3,8
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值