赞
踩
以一个求阶乘的函数为例讲述如何编写和使用函数。
我们提倡 分离式编译 (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,形参为一个整型变量的函数。在此处仅仅是声明,并不设计该函数的具体实现。
将函数的声明直接放在使用该函数的源文件中也是合法的,但是这么做也许会很繁琐并且容易出错。如果将函数的声明放在头文件中,既能保证同意函数的所有声明保持一致,在将来万一我们想要修改函数的接口也会更加的方便。
在这个例子中,函数的定义如下:
#include "fact.h"
unsigned int fact(int a)
{
unsigned int temp = 1;
while (a > 1)
{
temp *= a--;
}
return temp;
}
首先,为了将源文件与头文件关联起来,我们必须将含有函数声明的头文件包含进定义函数的源文件中,即第一行 include 语句。
随后我们开始定义这个计算阶乘的函数。它的返回,函数名,形参与头文件中一致,大括号内是函数体,涉及到函数的具体实现,最后返回了一个temp,其类型必须与函数的返回类型一致。
#include "fact.h"
using namespace std;
int main()
{
int a = 0;
cin >> a;
cout << fact(a) << endl;
return 0;
}
要调用fact函数,必须先在源文件中include声明其的头文件。
我们用调用运算符() 来执行函数。函数的调用完成两项工作:一是用实参初始化函数的形参,二是将控制权转移给被调用函数。
用实参初始化函数的形参是指程序会首先创建一个名字为a的int变量,并用调用运算符内的实参初始化这个变量。该变量的生命周期仅在fact函数被调用期间,一旦函数执行结束,该变量就会被“销毁”。
如上文所示的程序,主函数中定义的变量 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并没有被改变。
当形参是引用类型的时候,这时的实参被 引用传递 了。此时的形参被绑在了对应的实参上,也就是说我们可以通过形参更改实参的值。
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,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。