要使用C++函数,必须完成 3 个工作:① 提供函数定义;② 提供函数原型;③ 调用函数。
库函数是已经定义和编译好的函数,同时可以使用标准库头文件提供其原型。如 strlen() 函数用来确定字符串的长度,头文件 cstring 包含了 strlen() 函数的原型,只需要包含头文件 #include <cstring> 即可。
calling.cpp程序演示了函数定义、提供原型和调用:
// calling.cpp -- defining, prototyping, and calling a function #include <iostream> // function prototype void simple(); int main() { using namespace std; cout << "main() will call the simple() function:\n"; simple(); // function call cout << "main() is finished with the simple() function.\n"; return 0; } // function definition void simple() { using namespace std; cout << "I'm but a simple function.\n"; }
编译输出:
main() will call the simple() function: I'm but a simple function. main() is finished with the simple() function.
① 执行simple()时,将暂停执行main()的代码; 等simple()执行完毕后,继续执行main()中的代码。
② 每个函数定义中,都使用了一条using编译指令,因为每个函数都使用了cout。
7.1.1 定义函数
函数分为两类:
1. 没有返回值的函数被称为void函数。语法如下:
void functionName (parameterList) { statements; return; // optional }
其中,parameterList指定了传递给函数的参数类型和数量;返回语句 return 0; 是可选的;
2. 有返回值的函数,将生成一个值,并将它返回给调用函数。语法如下:
typeName functionName (parameterList) { statemets; return value; // value is type cast to type typeName }
① 函数的类型被声明为返回值的类型。
② 对于有返回值的函数,必须使用返回语句,以便将值返回给调用函数。值可以是常量、变量,也可以是表达式,只是其结果的类型必须为typeName类型或可以被转换为typeName。然后,函数将最终的值返回给调用函数。
③ C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型 — 整数、浮点数、指针,结构和对象。
通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中将其返回。随后,调用程序将查看该内存单元。返回函数和调用函数必须就该内存单元中存储的数据类型达成一致。函数定义计算返回值,调用函数寻找返回值。
函数在执行返回语句后结束。如果函数包含多条返回语句,则函数在执行遇到的第一条返回语句后结束。
7.1.2 函数原型和函数调用
函数原型经常隐藏在include文件中。
protos.cpp程序使用了函数cheer()和cube(),注意其中的函数原型:
#include <iostream> void cheers(int); // prototype: no return value double cube(double x); // prototype: return a double int main() { using namespace std; cheers(5); // function call cout << "Give me a number: "; double side; cin >> side; double volume = cube(side); // function call cout << "A " << side << "-foot cube has a volume of " << volume << " cubic feet.\n"; cheers(cube(2)); // prototype protection at work return 0; } void cheers(int n) { using namespace std; for (int i = 0; i < n; i++) cout << "Cheers! "; cout << endl; } double cube(double x) { return x * x * x; }
编译输出:
Cheers! Cheers! Cheers! Cheers! Cheers! Give me a number: 5 A 5-foot cube has a volume of 125 cubic feet. Cheers! Cheers! Cheers! Cheers! Cheers! Cheers! Cheers! Cheers!
① 只有在函数使用了名称空间std中的成员时,才在该函数中使用了using编译指令。
② main()使用函数名和参数来调用void类型的函数。
③ 由于cube()有返回值,因此main()可以将其用在赋值语句中。
为什么需要原型?
① 原型描述了函数到编译器的接口。它将函数返回值的类型以及参数的类型和数量告诉编译器。
② C++编程风格是将main()放在最前面,因为它通常提供了程序的整体结构。
原型的语法
① 函数原型是一条语句,必须以分号结束。
② 函数原型不要求提供变量名,有类型列表就足够了。
③ 通常,在原型的参数列表中,可以包括变量名,也可以不包括。原型中的变量名相当于占位符,因此不必与函数定义中的变量相同。
C++原型
① 在C++中,原型是必不可少的。
② 在C++中,括号为空和在括号中使用关键字void是等效的,意味着函数没有参数。
原型的功能
① 编译器正确处理函数的返回值。
② 编译器检查使用的参数数目是否正确。
③ 编译器检查使用的参数类型是否正确。如果不正确,则转换为正确的类型。
C++自动将传递的值转换为原型中指定的类型,条件是两者都是算术类型。仅当有意义时,原型化才会导致类型转换。
在编译阶段进行的原型化被称为静态类型检查(static type checking)。可以看出,静态类型检查可捕获许多在运行阶段非常难以捕获的错误。
联系客服