C++ Primer中文版(第五版)——第六章 函数

6.1函数基础

一个典型的函数定义包括以下几个部分:返回类型(return type)、函数名字、由0个或多个形参组成的参数列表以及函数体。其中,形参以逗号隔开,形参的列表位于一对圆括号之内。函数执行的操作在语句块中说明,该语句块称为函数体。

我们通过调用运算符(call operator)来执行函数。调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是函数或者是指向函数的指针;圆括号之内是一个用逗号隔开的实参列表,我们用实参初始化函数的形参。调用表达式的类型就是函数的返回类型。

编写函数

举个例子,我们准备编写一个求数的阶乘的程序。n的阶乘是从1到n所有数字的乘积,例如5的阶乘是120。即:1 * 2 * 3 * 4 * 5 = 120。

程序如下所示:

// val的阶乘是val * (val - 1) * (val - 2) ... * ((val - (val - 1))*1)

int fact(int val)

{

int ret = 1;          // 定义一个局部变量,用于保存计算结果

while(val > 1)

ret *= val--;  // 把ret和val的乘积赋值给ret,然后val减1

return ret;          // 返回结果

}

函数的名字是fact,它作用于一个整型参数,返回一个整型值。在while循环内部,在每次迭代时,用后置递减运算符将val的值减1.return语句负责结束fact函数,并返回结果ret的值。

函数调用

要调用fact函数,必须提供一个int型值,调用得到的结果也是一个整数:

int main()

{

int j = fact(5);                           // j = 120,即fact(5)的结果。

cout << "5! is : " << j << endl;

return 0;

}

函数的调用完成两项工作:一、用实参初始化函数对应的形参;二、将控制权转移给被调函数。此时,主调函数的执行被暂时中断,被调函数开始执行。

执行函数的第一步是(隐式地)定义并初始化它的形参。因此,当调用fact函数时,首先创建一个名为val的int型变量,然后将它初始化为调用时所用的实参5。

当遇到一条return语句时函数结束执行过程。和函数的调用一样,return语句也完成两项工作:一是返回return语句中的值(如果有的话);二是将控制权从被调函数转移回主调函数。函数的返回值用于初始化调用表达式的结果,之后继续执行主调函数中调用所在表达式的剩余部分。因此,对fact函数的调用等价如下形式:

int val = 5;   // (隐式地)定义并初始化形参val = 5

int ret = 1;   // fact函数体内的代码

while(val > 1)

{

ret *= val--;

int j = ret;  // 用被调函数的返回值ret的副本,初始化主调函数的调用表达式的结果j

}

形参和实参

实参是形参的初始值。第一个实参初始化第一个形参,第二个实参初始化第二个形参,以此类推。尽管实参和形参存在对应关系,但是并没有规定实参的求值顺序。编译器能够以任意可行的顺序对实参求值。

实参的类型必须与对应的形参类型匹配。函数有几个形参,就必须提供相同数量的实参。因为函数的调用规定实参数量应该与形参数量一致,所以形参一定会被初始化。

函数的形参列表

函数的形参列表可以为空,但是不能省略。要想定义一个不带形参的函数,最常用的办法是书写一个空的形参列表。不过为了与C语言兼容,也可以使用关键字void表示函数没有形参。

void f1 () {/*...*/}          // 隐式地定义空形参列表

void f2 (void) {/*...*/}    // 显示地定义空形参列表,与C语言兼容

形参列表中的形参通常用逗号隔开,其中每个形参都是含有一个声明符的声明。即使两个形参的类型一样,也必须把两个类型都写出来:

int f3 (int v1,int v2) {/*...*/}

任意两个形参都不同同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字。形参名是可选的,但是由于我们无法使用未命名的形参,所以形参都应该有个名字。偶尔,函数确实有个别形参不会被用到,则此类形参通常不命名,以表示在函数体内不会用到此类形参。不管怎样,是否设置未命名的形参并不影响调用时所提供的实参数量。即使某个形参不会被函数使用,也必须为它提供一个实参。

函数返回类型

大多数类型都能用作函数的返回类型。一种特殊的类型是void,它表示函数不返回任何值。函数的返回类型不能是数组类型或函数类型,但可以使指向数组或函数的指针。

时间: 2024-08-04 14:14:13

C++ Primer中文版(第五版)——第六章 函数的相关文章

《C++ Primer》 第四版 第7章 函数

<C++ Primer> 第四版 第7章 函数 思维导图笔记 超级具体.很具体,图片版,有利于复习查看 http://download.csdn.net/detail/onlyshi/9479711

C primer plus 第五版十二章习题

看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: 1 /* global.c --- 使用外部变量 */ 2 #include <stdio.h> 3 int units = 0; //一个外部变量 4 void critic(void); 5 int main(void) 6 { 7 extern int units; 8 9 printf ("How many pounds

c++ primer(中文版第四版)第8章关于cin.clear(istream::failbit)的一个误区

抛出问题: 先附上书本中的例题程序代码 #include <iostream> int main(){ int ival; while (std::cin >> ival, !std::cin.eof()){ if (std::cin.bad()) throw std::runtime_error("IO stream corrupted"); if (std::cin.fail()){ std::cerr << "bad data, tr

C++primer(第五版)第二章的学习笔记(也有对部分习题的解答和指出c++11特性)

算术类型分为两类:整型(字符和bool在内)和浮点型. C/C++算术类型 类型 含义 最小尺寸 bool 布尔类型 未定义 char 字符 8位 wchar_t 宽字符 16位 char16_t Unicode字符 16位 char32_t Unicode字符 32位 short 短整型 16位 int  整型 16位 long 长整型 32位 long long 长整型 64位 unsigned long 无符号长整型 32位 double 双精度浮点数 10位有效数字 long doubl

C Primer Plus (第五版) 第九章 函数 编程练习

第九章 函数 编程练习 设计函数 min(x,y),返回两个double数值中较小的数值,同时用一个简单的驱动程序测试该函数. #include <stdio.h> double min(double x, double y); int main(void) { double a, b; printf("请输入两个数:\n"); scanf("%lf%lf", &a, &b); printf("两个数中较小的数是:%lf\n&q

c++ primer(第五版)学习笔记及习题答案代码版(第六章)函数

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,编译需要包含Chapter6.h头文件. 需要演示某一题直接修改 #define NUM***, 如运行6.23题为#define NUM623: chapter 6 1. 形参初始化的机理与变量初始化一样. 当形参是引用类型时,它对应的实参被引用传递或者函数被传引用调用. 2. const和实参 void fcn(const int i){ /*fcn能够读取i,但是不能向i写值*/} void fcn(int i){ /*.

c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.h 和.cc 中,需要演示某一题直接修改 #define NUM****, 如运行14.30题为#define NUM1430: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful f

c++ primer(第五版)学习笔记及习题答案代码版(第十一章)关联容器

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,包含Chapter7.h头文件,读入文件包括./test ./rules .需要演示某一题直接修改 #define NUM****, 如运行11.23题为#define NUM1123: chapter 11 1.  关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back.原因是关联容器中元素是根据关键字存储的,这些操作对 关联容器没有意义.而且关联容器也不支持构造函数或插入操作这些接收一个元素值和

C++ Primer【第五版】习题参考答案——第六章(函数)

本系列文章会不断更新,但是时间不能保证.另外基本上都是自己做的答案,仅供参考,如果有疑问欢迎交流. #include <iostream> #include <initializer_list> using namespace std; int test_Ex_6_27(std::initializer_list<int> li); int main() { cout << test_Ex_6_27({23,78,89,76,90}) << en

《C++ Primer(中文版)(第5版)》斯坦利&#183;李普曼 (Stanley B. Lippman) (作者), 约瑟&#183;拉乔伊 (Josee Lajoie) (作者), 芭芭拉&#183;默 (Barbara E. Moo) (作者) azw3

内容简介: 这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的--C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委员会原负责人Josée Lajoie 对C++标准的深入理解,以及C++ 先驱 Barbara E.Moo在C++教学方面的真知灼见外,更是基于全新的C++11标准进行了全面而彻底的内容更新.非常难能可贵的是,<C++ Primer中文版(第5版)>所有示例均全部采用C++11标准改写,这在经典升