- 将函数独立出来的好处有:
1)以一连串函数调用操作取代重复编写相同的程序代码,使程序易读;
2)可以在不同的程序中使用这些函数;
3)可以更容易地把工作分配给协作开发团队。
- 每个函数必须定义返回类型、函数名、参数列表和函数体四个部分。
- 函数必须先被声明才能被调用(使用)。
- 函数的声明让编译器得以检查后续出现的使用方式是否正确(参数是否足够、参数类型是否正确等)
- 函数声明不必提供函数体,但必须指明返回类型、函数名和参数列表,即所谓的函数原型(function prototype)。
- 函数的定义包括函数原型和函数体。
- 成对的
/*
、*/
是多行注释。 - 当用户输入一个不合理的值时,可以终止整个程序(稍显极端)或抛出异常(见第七章)。
- 标准库的
exit()
函数用来终止程序。必须传一个值作为程序结束时的状态值。
#include <cstdlib>
//...
//以状态-1结束程序
if(pos <= 0)
exit(-1);
- 函数只能返回一个值。题目“
fibon_elem()
是否计算出指定元素”关系到其返回值为true
或false
,而返回该元素的实际值可通过加入第二个参数完成,如:
//修正函数原型
bool fibon_elem(int pos, int &elem);
- 每个值类型都只能表示其值域(domain)中的最小至最大值间的某个值,超出即发生溢出(overflow)。
想知道某个类型的最小/最大值,可查询标准库中的
numeric_limits
class
#include <limits>
int max_int = numeric_limits<int>::max();
double min_dbl = numeric_limits<double>::min();
- 函数的声明可以不写出参数的名称,参数名称只有在函数内使用参数时才是必要的。
- 如果函数的返回类型不为
void
,必须在每个可能的退出点上将值返回。如果函数的最后一条语句不是return
,那么最后一条语句之后便是该函数的隐式退出点,隐式退出点不返回任何数值则编译出错。 return;
语句不返回任何数值,只在返回值为void
时才被使用,可以提前结束函数的执行。- 两种参数传递方式:传址(by reference)和传值(by value)。
- 当我们调用一个函数时,会在内存中建立起一块特殊区域,称为程序堆栈(program stack),提供了每个函数参数的储存空间,也提供了函数所定义的每个对象的内存空间(这些对象也叫局部对象local object)。一旦函数完成,这块内存就会被释放,也就是从程序堆栈中被
pop
出来。 - 将对象传入函数,默认情形下它的值会被复制一份,成为参数的局部定义。这种方式称为传值。
- 让参数和传入的实际对象产生关联,即传址,最简单的方法便是将参数声明为一个引用(reference):
void swap(int &val1, int & val2)
{
int temp = val1;
val1 = val2;
val2 = temp;
}
- reference扮演着外界与对象之间一个间接手柄的角色。只要在类型名称和reference名称之间插入
&
符号,便是声明了一个reference。
int ival = 1024; //对象,类型为int
int *p