文章目录
- 导语
- 使用有返回值的函数
- 函数变体
- 用户定义的函数
- 用户定义的有返回值的函数
导语
函数用于创建 C++ 程序的模块, 对 C++ 的 OOP 定义至关重要。
C++ 函数分两种: 有返回值的和没有返回值的。
使用有返回值的函数
有返回值的函数将生成一个值, 而这个值可赋给变量或在其他表达式中使用。
表达式 sqrt(6.25) 将调用 sqrt( ) 函数。 表达式 sqrt(6.25) 被称为函数调用, 被调用的函数叫做被调用函数, 包含函数调用的
函数叫做调用函数。
参数是发送给函数的信息, 返回值是从函数中发送回去的值。
在使用函数之前, C++ 编译器必须知道函数的参数类型和返回值类型。C++ 提供这种信息的方式是使用函数原型语句。
C++ 程序应当为程序中使用的每个函数提供原型。函数原型之于函数就像变量声明之于变量—指出涉及的类型。
sqrt() 的函数原型像这样:
第一个 double 意味着 sqrt() 将返回一个 double 值。 括号中的 double 意味着 sqrt() 需要一个 double 参数。
原型结尾的分号表明它是一条语句, 这使得它是一个原型, 而不是函数头。 如果省略分号, 编译器将把这行代码解释为一个函数头, 并要求接着提供定义该函数的函数体。
在程序中使用 sqrt() 时, 也必须提供原型。 可以用两种方法来实现:
- 在源代码文件中输入函数原型;
- 包含头文件 cmath(老系统为 math.h) , 其中定义了原型
不要混淆函数原型和函数定义。 原型只描述函数接口。它描述的是发送给函数的信息和返回的信息。 而定义中包含了函数的代码, 如计算平方根的代码。 C 和 C++ 将库函数的这两项特性(原型和定义) 分开了。 库文件中包含了函数的编译代码, 而头文件中则包含了原型。
C++库函数存储在库文件中。 编译器编译程序时, 它必须在库文件搜索您使用的函数。
函数变体
有些函数需要多项信息。 这些函数使用多个参数, 参数间用逗号分开。
数学函数 pow() 接受两个参数, 返回值为以第一个参数为底, 第二个参数为指数的幂。
另外一些函数不接受任何参数。
关键字 void 明确指出, 该函数不接受任何参数。 如果省略 void, 让括号为空, 则 C++ 将其解释为一个不接受任何参数的隐式声明。
在 C++ 中, 函数调用中必须包括括号, 即使没有参数。
还有一些函数没有返回值。
在有些语言中, 有返回值的函数被称为函数(function) ; 没有返回值的函数被称为过程(procedure) 或子程序(subroutine) 。 但 C++ 与 C 一样, 这两种变体都被称为函数。
用户定义的函数
每个 C++ 程序都必须有一个 main( ) 函数, 用户必须对它进行定义。
假设需要添加另一个用户定义的函数。 和库函数一样, 也可以通过函数名来调用用户定义的函数。
对于库函数, 在使用之前必须提供其原型, 通常把原型放到 main( ) 定义之前。 但现在您必须提供新函数的源代码。 最简单的方法是, 将代码放在 main( ) 的后面。
函数格式
C++ 不允许将函数定义嵌套在另一个函数定义中。 每个函数定义都是独立的, 所有函数的创建都是平等的。
函数头
开头的 void 表明 simon( ) 没有返回值, 因此调用 simon( ) 不会生成可在 main( ) 中将其赋给变量的数字。
空括号(其中可以包含 void) 表明, main( ) 没有参数。 对于有返回值的函数, 应使用关键字
return 来提供返回值, 并结束函数。
main( ) 返回一个 int 值, 而程序员要求它返回整数 0。 但可能会产生疑问, 将这个值返回到哪里了呢?
计算机操作系统(如UNIX或Windows) 看作调用程序。 因此, main( ) 的返回值并不是返回给程序的其他部分, 而是返回给操作系统。 很多操作系统都可以使用程序的返回值。 例如, UNIX外
壳脚本和Windows命令行批处理文件都被设计成运行程序, 并测试它们的返回值(通常叫做退出值) 。 通常的约定是, 退出值为 0 则意味着程序运行成功, 为非零则意味着存在问题。
用户定义的有返回值的函数
return 后面并非一定得跟一个简单的数字。 也可以通过使用较为复杂的表达式, 避免了创建一个新变量, 将结果赋给该变量, 然后将它返回。
在可以使用一个简单常量的地方, 都可以使用一个返回值类型与该常量相同的函数。
函数原型描述了函数接口, 即函数如何与程序的其他部分交互。 参数列表指出了何种信息将被传递给函数, 函数类型指出了返回值的类型。
函数特性:
- 有函数头和函数体
- 接受一个参数
- 返回一个值
- 需要一个原型