首页 / 资讯中心 / 文章详情

第 6 章 · 函数

第 6 章 · 函数 ★ FEATURED ARTICLE
函数是编程里最重要的概念之一把一段代码封装起来起个名字需要时调用。它让代码可复用、可读、好维护。本章讲如何定义函数、传参数、返回值。6.1 为什么需要函数假设要算很多次两个数的平方和a² b²每次都写intr13*34*4;intr25*56*6;intr37*78*8;又啰嗦又容易错。用函数封装intsquareSum(inta,intb){// 定义函数returna*ab*b;}intr1squareSum(3,4);// 调用返回 25intr2squareSum(5,6);// 61清爽多了。函数 一段有名字、可重复调用的代码。6.2 定义函数函数的完整结构返回类型 函数名(参数列表){// 函数体return返回值;}逐部分解释返回类型函数算出来的结果是什么类型int、double、void…函数名调用时用的名字参数列表调用时传入的输入可以有多个用逗号分隔也可以没有函数体{ }里要执行的代码return返回结果并结束函数举例// 无参数、无返回值的函数voidgreet(){std::cout你好std::endl;}// 有参数、有返回值intadd(intx,inty){returnxy;}// 有参数、无返回值voidprintTwice(intn){std::coutn nstd::endl;}void表示没有返回值这样的函数不需要写return或写return;。参数就是输入返回值就是输出。6.3 调用函数定义好函数后用函数名(实际参数)调用#includeiostreamintadd(intx,inty){returnxy;}intmain(){intresultadd(3,5);// 调用 add3 和 5 是实参std::coutresultstd::endl;// 8return0;}调用过程程序执行到add(3, 5)跳进add函数x3、y5执行return x y;算出 8带着 8 跳回调用处result 8术语定义时写的是形参x、y调用时传的是实参3、5。实参的值复制给形参。6.4 参数的值传递C 默认是值传递调用函数时把实参的值复制一份给形参。所以函数内修改形参不影响外部的实参#includeiostreamvoidchange(intx){x100;// 改的是副本}intmain(){inta5;change(a);std::coutastd::endl;// 还是 5没被改}想真正修改外部的变量要用引用第 8 章讲。6.5 函数声明与定义分离C 要求先声明、后使用。如果函数定义在main之后main里就调用不到。解决方法是先声明#includeiostreamintadd(intx,inty);// 函数声明也叫原型只写签名不写函数体intmain(){std::coutadd(3,5)std::endl;// 现在可以调用了return0;}intadd(intx,inty){// 函数定义在下面补全函数体returnxy;}声明只告诉编译器有这么个函数长这样定义才给出具体实现。真实项目里声明通常放头文件.h定义放源文件.cpp后面会看到。6.6 返回值 vs 打印别搞混新手常混淆返回和打印intgetFive(){std::cout5std::endl;// 这是打印不是返回return5;// 这才是返回}打印std::cout是给人看的结果显示在屏幕。返回return是把值交给调用者用于后续计算。很多函数既要返回也要打印但要清楚两者是两回事。6.7 递归函数调用自己函数可以调用自己这叫递归。经典例子是阶乘n! n × (n-1) × ... × 1intfactorial(intn){if(n1)return1;// 基准情况递归的出口returnn*factorial(n-1);// 递归调用自己}// factorial(5) 5 * factorial(4) 5 * 4 * factorial(3) ... 120递归必须有一个基准情况停止条件否则会无限调用导致崩溃。递归虽然优雅但初学不必强求。理解函数能调用自己即可。6.8 完整示例#includeiostream// 判断一个数是否为质数boolisPrime(intn){if(n2)returnfalse;// 小于 2 的不是质数for(inti2;i*in;i){// 只需试除到 sqrt(n)if(n%i0)returnfalse;// 能整除不是质数}returntrue;}intmain(){std::cout100 以内的质数std::endl;for(inti1;i100;i){if(isPrime(i)){std::couti ;}}std::coutstd::endl;return0;}这个例子把判断质数封装成isPrime函数主函数里就能干净地复用。实际输出100 以内的质数 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 976.9 小结函数 有名字、可复用的代码块。定义返回类型 函数名(参数) { 函数体 }。return返回结果void表示无返回值。默认值传递函数内改参数不影响外部。先声明、后使用声明和定义可以分离。递归是函数调用自己必须有停止条件。下一章学习数组与字符串——存储一组数据和文字。练习题写函数max(a, b)返回两个数中较大的一个。写函数isEven(n)判断偶数返回 bool。写函数计算12...n的和。写递归函数求斐波那契数列第 n 项。写函数abs(x)返回绝对值比较值传递的效果。
阅读完成 · 觉得有帮助?
咨询建站