C++程序设计教程(第二版)课件_第1页
C++程序设计教程(第二版)课件_第2页
C++程序设计教程(第二版)课件_第3页
C++程序设计教程(第二版)课件_第4页
C++程序设计教程(第二版)课件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++程序设计教程(第二版)第五章函数机制Chapter5

FunctionMechanism

清华大学出版社钱能8/8/20231C++程序设计教程(第二版)第五章函数机制清华大学出版社函数

C++的函数是完成既定任务的功能(过程)体,它涵盖了数学函数和一般过程.所以基于过程编程本质上就是基于函数编程函数机制一是指程序运行过程中对函数调用的数据管理和处理过程

二是指编程中函数的使用规范.它包括函数参数的属性和传递规则,函数返回类型的匹配与审查,函数名字的识别原则,函数体效率的选择,函数体中数据的访问权限等8/8/20232函数8/1/20232第五章内容函数性质(FunctionCharacter)

指针参数(PointerParameters)

栈机制(StackMechanism)

函数指针(FunctionPointers)main参数(Themain’sParameters)

递归函数(RecursiveFunctions)

函数重载(FunctionOverload)

8/8/20233第五章内容函数性质(FunctionCharacter1.函数性质(FunctionCharacter)函数:对输入参数负责,埋头做自己的事,最终返回结果函数组织:通过在函数中进行函数调用来扩展运行的规模,层层叠叠的函数构成树结构做法:将若干个函数组织成文件,又将若干个文件构成程序的办法来进行编程分工8/8/202341.函数性质(FunctionCharacter跨越数学函数的C++函数,有四种形态返回类型func(参数列表);返回类型func();voidfunc(参数列表);voidfunc();8/8/20235跨越数学函数的C++函数,有四种形态返回类型func(黑盒原则:函数使用者应关注性能,而少去左右实现细节intcost(intn,intm){

returnn*10;//运输n次m斤}intcost(intn,intm){

returnm*10;//运输m次n斤}//选择下一个最好的intcost(intn,intm){

return(n>m?m:n)*10;//保证运输次数最少}8/8/20236黑盒原则:函数使用者应关注性能,而少去左右实现细节int参数传递:形参是对实参的克隆,克隆必须遵守类型匹配规则voidf(Typea);//a为形参voidg(){Typex;f(x);//x为实参}a实体x实体复制Type类型Type类型8/8/20237参数传递:形参是对实参的克隆,克隆必须遵守类型匹配规则voi2.指针参数(PointerParameters)传递指针:指针参数也是值传递的,指针值的真正用途是进行数据间访,以达到操作数据块(大小由之)的目的传递引用:引用参数本质上也是值传递的,它表现为名字传递,即以形参的名字来代替实参名字.如果实参不是实体名而是表达式,那么其表达式所对应的临时实体取名为形参,并要求其为常量引用意义:指针和引用参数的存在,使函数实际上可以访问非局部的数据区,函数的黑盒性便名存实亡.但这并非一定坏事,指针是一把双刃剑,或灵巧或邪恶.引用是为了防范指针非安全的无意操作8/8/202382.指针参数(PointerParametersvoidmySort(int*b,intsize);voidf(){inta[]={3,5,7,1,8,4,9};mySort(a,sizeof(a)/sizeof(a[0]));}传递指针须附带传递单位数据的个数元素个数传指针8/8/20239voidmySort(int*b,intsize);限制无意操作带来的意外副作用vector<int>add(//向量加法

constvector<int>&a,

constvector<int>&b){vector<int>c(a.size());

for(unsignedi=0;i<a.size();++i)c[i]=a[i]+b[i];

returnc;}8/8/202310限制无意操作带来的意外副作用vector<int>add(3.栈机制(StackMechanism)运行时内存布局栈区进程空间代码区全局数据区堆区8/8/2023113.栈机制(StackMechanism)运行未初始化局部数据的不确定性#include<iostream>voidf(){

intb;//未初始化std::cout<<”B=>”<<b<<“\n”;}//-------------------------intmain(){

inta;//未初始化std::cout<<”A=>”<<a<<“\n”;f();}//-------------------------//8804248//27880488/8/202312未初始化局部数据的不确定性#include<iostream#include<iostream>inta=5;intb=6;intmain(){int*ap=(int*)4202660;*ap=8;std::cout<<a<<“\n”;std::cout<<int(&b)<<“\n”;}//8//4202664

指针的无约束性5642026604202664ab4202660ap8/8/202313#include<iostream>指针的无约束性564204.函数指针(FunctionPointers)函数类型:函数类型因参数类型、个数和排列顺序的不同而不同,也因返回类型的不同而不同.函数指针:指向代码区中函数体代码的指针.不同的函数类型,其函数指针也不同用法:函数指针经常用作函数参数,以传递连函数本身都不知道的处理过程(函数)8/8/2023144.函数指针(FunctionPointers不同的函数指针,不能相互赋值intg(int);int(*gp)(int)=g;voidf();void(*fp)();fp=f;gp=fp;//error不同的函数8/8/202315不同的函数指针,不能相互赋值intg(int);不同的函数函数指针作为参数传递(函数名看作是函数指针)boollessThanBitSum(inta,intb){

intsuma=0,sumb=0;

for(intx=a;x;x/=10)suma+=x%10;for(intx=b;x;x/=10)sumb+=x%10;

returnsuma<sumb;}intmain(){

inta[]={33,61,12,19,14,71,78,59};sort(aa,aa+8,lessThanBitSum);

for(inti=0;i<8;++i)cout<<aa[i]<<"";cout<<"\n";}//12143361711959788/8/202316函数指针作为参数传递(函数名看作是函数指针)boolle指定函数指针类型,定义函数指针数组typedef

void(*MenuFun)();voidf1(){cout<<"good!\n";}voidf2(){cout<<"better!\n";}voidf3(){cout<<"best!\n";}MenuFunfun[]={f1,f2,f3};指针类型名8/8/202317指定函数指针类型,定义函数指针数组typedefvoid5.main参数(Themain’sParameters)程序运行:操作系统读入命令以启动程序重定向命令:操作系统读入命令后,识别并自我消化的参数main函数参数:操作系统读入命令后,不能识别参数,将其直接传递给所启动的程序8/8/2023185.main参数(Themain’sParam命令重定向//f0509.cpp#include<iostream>usingnamespacestd;intmain(){for(inta,b;cin>>a>>b;)cout<<a+b<<”\n”;}E:\ch05>f0509<abc.txt↙17213578991212345abc.txt8/8/202319命令重定向//f0509.cppE:\ch05>f0509main函数参数//f0510.cpp#include<iostream>usinganmespacestd;intmain(intargc,char**argv){

for(inti=0;i<argc;++i)cout<<argv[i]<<endl;}E:\ch05>f0510a1a2a3↙f0510a1a2a38/8/202320main函数参数//f0510.cppE:\ch05>f06.递归函数(RecursiveFunctions)形式上:一个正在执行的函数调用了自身(直接递归).或者,一个函数调用了另一个函数,而另一个函数却调用了本函数(间接递归)本质上:程序在运行中调用了相同代码实体的函数,却在函数栈中重新复制了该函数的整套数据,由于每套数据中的参数也许不同,导致了计算条件发生变化,使得函数得以逐步逼近终极目标而运行8/8/2023216.递归函数(RecursiveFunction递归函数可以转换为非递归函数

例如,求最大公约数longgcd1(inta,intb)//递归版{

if(a%b==0)

returnb;

returngcd(b,a%b);}//--------------------------longgcd2(inta,intb)//非递归版{

for(inttemp;b;a=b,b=temp)temp=a%b;

returna;}//--------------------------8/8/202322递归函数可以转换为非递归函数

例如,求最大公约数longg7.函数重载(FunctionOverload)函数重载:一组概念相同,处理对象(参数)不同的过程,出于方便编程的目的,用同一个函数名字来命名的技术称为函数重载参数默认:一个函数,既可以严谨和地道的调用,也可以省略参数,轻灵地调用,达到此种方便编程目的的技术称为参数默认重载与参数默认:它们都是通过参数的变化来分辨处理任务的不同.如果参数决定了不同的处理过程,则应重载,否则参数默认更简捷一些8/8/2023237.函数重载(FunctionOverload重载是不同的函数,以参数的类型,个数和顺序来分辨voidprint(double);voidprint(int);voidfunc(){print(1);//voidprint(int);print(1.0);//voidprint(double);print(‘a’);//voidprint(int);print(3.1415f);//voidpirnt(double);}8/8/202324重载是不同的函数,以参数的类型,个数和顺序来分辨voidp参数默认是通过不同参数来分辨一个函数调用中的行为差异voiddelay(inta=2);//函数声明时intma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论