《C++程序设计教程(第二版)ppt课件.ppt》由会员分享,可在线阅读,更多相关《C++程序设计教程(第二版)ppt课件.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、14:11:301C+程序设计教程(第二版)第五章 函数机制 Chapter 5 Function Mechanism 清华大学出版社 钱 能14:11:312n函数 C+的函数是完成既定任务的功能(过程)体,它涵盖了数学函数和一般过程所以基于过程编程本质上就是基于函数编程n函数机制 一是指程序运行过程中对函数调用的数据管理和处理过程 二是指编程中函数的使用规范它包括函数参数的属性和传递规则,函数返回类型的匹配与审查,函数名字的识别原则,函数体效率的选择,函数体中数据的访问权限等14:11:313第五章内容1. 函数性质函数性质( Function Character ) 2. 指针参数指针参
2、数 ( Pointer Parameters ) 3. 栈机制栈机制 ( Stack Mechanism ) 4. 函数指针函数指针 ( Function Pointers )5. main参数参数 ( The mains Parameters ) 6. 递归函数递归函数 ( Recursive Functions ) 7. 函数重载函数重载 ( unction Overload ) 14:11:3141. 函数性质函数性质 ( Function Character )函数:对输入参数负责,埋头做自己的事,最终返回结果函数组织:通过在函数中进行函数调用来扩展运行的规模,层层叠叠的函数构成树结构
3、做法:将若干个函数组织成文件,又将若干个文件构成程序的办法来进行编程分工14:11:315跨越数学函数的C+函数,有四种形态n返回类型 func ( 参数列表 ) ;n返回类型 func ( ) ;nvoid func ( 参数列表 ) ;nvoid func ( ) ;14:11:316黑盒原则:函数使用者应关注性能,而少去左右实现细节int cost ( int n, int m ) return n*10; / 运输n次m斤int cost ( int n, int m ) return m*10; / 运输m次n斤/ 选择下一个最好的int cost ( int n, int m )
4、return (nm? m:n)*10; / 保证运输次数最少14:11:317参数传递:形参是对实参的克隆,克隆必须遵守类型匹配规则void f(Type a); /a为形参void g() Type x; f(x); /x为实参a实体x实体复制Type类型Type类型14:11:318. 指针参数指针参数 ( Pointer Parameters )传递指针:指针参数也是值传递的,指针值的真正用途是进行数据间访,以达到操作数据块(大小由之)的目的传递引用:引用参数本质上也是值传递的,它表现为名字传递,即以形参的名字来代替实参名字如果实参不是实体名而是表达式,那么其表达式所对应的临时实体取名
5、为形参,并要求其为常量引用意义:指针和引用参数的存在,使函数实际上可以访问非局部的数据区,函数的黑盒性便名存实亡但这并非一定坏事,指针是一把双刃剑,或灵巧或邪恶引用是为了防范指针非安全的无意操作14:11:319void mySort(int* b, int size);void f() int a = 3, 5, 7, 1, 8, 4, 9; mySort(a, sizeof(a)/sizeof(a0);传递指针须附带传递单位数据的个数元素个数传指针14:11:3110限制无意操作带来的意外副作用vector add( / 向量加法 const vector& a, const vector
6、& b) vector c(a.size(); for(unsigned i=0; ia.size(); +i) ci = ai + bi; return c;14:11:31113. 栈机制栈机制 ( Stack Mechanism )运行时内存布局栈区进程空间代码区全局数据区堆区14:11:3112未初始化局部数据的不确定性#includevoid f() int b; / 未初始化 std:cout”b“n”;/-int main() int a; / 未初始化 std:cout”a“n”; f();/-/ 8804248/ 278804814:11:3113#includeint a=
7、5;int b=6;int main() int* ap=(int*)4202660; *ap=8; std:couta“n”; std:coutint(&b)“n”;/ 8/ 4202664 指针的无约束性5642026604202664ab4202660ap14:11:31144. 函数指针函数指针 ( Function Pointers )函数类型:函数类型因参数类型、个数和排列顺序的不同而不同,也因返回类型的不同而不同函数指针:指向代码区中函数体代码的指针.不同的函数类型,其函数指针也不同用法:函数指针经常用作函数参数,以传递连函数本身都不知道的处理过程(函数)14:11:3115不同
8、的函数指针,不能相互赋值int g(int);int (*gp)(int) = g;void f();void (*fp)();fp = f;gp = fp; / error不同的函数14:11:3116函数指针作为参数传递 (函数名看作是函数指针)bool lessThanBitSum(int a, int b) int suma=0, sumb=0; for(int x=a; x; x/=10) suma += x%10; for(int x=b; x; x/=10) sumb += x%10; return suma sumb;int main() int a = 33, 61, 12,
9、 19, 14, 71, 78, 59; sort(aa, aa+8, lessThanBitSum); for(int i=0; i8; +i) coutaai ; coutn;/ 12 14 33 61 71 19 59 7814:11:3117指定函数指针类型,定义函数指针数组typedef void (*MenuFun)();void f1() coutgood!n; void f2() coutbetter!n; void f3() coutbest!n; MenuFun fun=f1,f2,f3;指针类型名14:11:31185. main参数参数 ( The mains Para
10、meters )程序运行:操作系统读入命令以启动程序重定向命令:操作系统读入命令后,识别并自我消化的参数main函数参数:操作系统读入命令后,不能识别参数,将其直接传递给所启动的程序14:11:3119命令重定向/ f0509.cpp#includeusing namespace std;int main() for(int a,b; cinab;) couta+bf0509 abc.txt17213578 99 1212 345abc.txt14:11:3120main函数参数/ f0510.cpp#includeusing anmespace std;int main(int argc,
11、char* argv) for(int i=0; iargc; +i) coutargvif0510 a1 a2 a3f0510a1a2a314:11:31216. 递归函数递归函数 ( Recursive Functions )形式上:一个正在执行的函数调用了自身(直接递归).或者,一个函数调用了另一个函数,而另一个函数却调用了本函数(间接递归)本质上:程序在运行中调用了相同代码实体的函数,却在函数栈中重新复制了该函数的整套数据,由于每套数据中的参数也许不同,导致了计算条件发生变化,使得函数得以逐步逼近终极目标而运行14:11:3122递归函数可以转换为非递归函数例如,求最大公约数long
12、gcd1(int a, int b) / 递归版 if(a%b=0) return b; return gcd(b, a%b);/-long gcd2(int a, int b) / 非递归版 for(int temp; b; a=b, b=temp) temp = a%b; return a;/-14:11:31237. 函数重载函数重载 ( Function Overload )函数重载:一组概念相同,处理对象(参数)不同的过程,出于方便编程的目的,用同一个函数名字来命名的技术称为函数重载参数默认:一个函数,既可以严谨和地道的调用,也可以省略参数,轻灵地调用,达到此种方便编程目的的技术称为
13、参数默认重载与参数默认:它们都是通过参数的变化来分辨处理任务的不同如果参数决定了不同的处理过程,则应重载,否则参数默认更简捷一些14:11:3124重载是不同的函数,以参数的类型,个数和顺序来分辨void print(double);void print(int);void func() print(1); / void print(int); print(1.0); / void print(double); print(a); / void print(int); print(3.1415f); / void pirnt(double); 14:11:3125参数默认是通过不同参数来分辨一个函数调用中的行为差异void delay(int a = 2); / 函数声明时函数声明时int main() delay(); / 默认延迟秒默认延迟秒 delay(2); / 延迟秒延迟秒 delay(5); / 延迟秒延迟秒void delay(int a) / 函数定义时函数定义时 int sum=0; for(int i=1; i=a; +i) for(int j=1; j3500; +j) for(int k=1; k100000; +k) sum+;