第五章函数省公共课一等奖全国赛课获奖课件_第1页
第五章函数省公共课一等奖全国赛课获奖课件_第2页
第五章函数省公共课一等奖全国赛课获奖课件_第3页
第五章函数省公共课一等奖全国赛课获奖课件_第4页
第五章函数省公共课一等奖全国赛课获奖课件_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第五章C++函数昆明理工大学电信系C++语言程序设计年3月1第1页本章主要内容本章介绍C++函数,包含:函数概述函数定义与申明函数调用年3月2第2页5.1函数概述

C++语言认为函数是一个能完成某一独立功效子程序,也就是程序模块。

函数就是对复杂问题一个“自顶向下,逐步求精”思想表达。

编程者能够将一个大而复杂程序分解为若干个相对独立而且功效单一小块程序(函数)进行编写,并经过在各个函数之间进行调用,来实现总体功效。

年3月3第3页5.1函数概述(续)使用函数优点:①可读性好;②易于查错和修改;③便于分工编写,分阶段调试;④各个函数之间接口清楚,便于相互间交换信息和使用;⑤节约程序代码和存放空间;⑥降低用户总工作量;⑦成为实现结构程序设计思想主要工具;⑧扩充语言和计算机原设计能力;⑨便于验证程序正确性。

年3月4第4页5.1函数概述(续)

设计C++程序过程,实际上就是编写函数过程,最少也要编写一个main()函数。 执行C++程序,也就是执行对应main()函数。即从main()函数第一个左花括号“{”开始,依次执行后面语句,直到最终一个右花括号“}”为止。假如在执行过程中碰到其它函数,则调用其它函数。调用完后,返回到刚才调用函数下一条语句继续执行。而其它函数也只有在执行main()函数过程中被调用时才会执行。年3月5第5页5.1函数概述(续)

函数能够被一个函数调用,也能够调用另一个函数,它们之间能够存在着调用上嵌套关系。不过,C++不允许函数定义嵌套,即在函数定义中再定义一个函数是非法。

C++函数是一个独立完成某个功效语句块,函数与函数之间经过输入和输出来联络。

年3月6第6页5.2函数定义与申明

在C++程序中调用函数之前,首先要对函数进行定义。假如调用此函数在前,函数定义在后,就会产生编译错误。 为了使函数调用不受函数定义位置影响,能够在调用函数前进行函数申明。这么,不论函数是在哪里定义,只要在调用前进行函数申明,就能够确保函数调用正当性。年3月7第7页5.2.1函数定义

C++中每一个函数都是从四个方面来进行定义:类型、函数名、形式参数表、函数体。 定义一个函数语法格式为: 类型

函数名(形式参数表)

{

函数体;

}年3月8第8页5.2.1函数定义(续)比如:intmax(inta,intb){intt;if(a>b)t=a;elset=b;returnt;}年3月9第9页5.2.1函数定义

类型就是该函数类型,也就是该函数返回值类型,这类型能够是C++中除函数、数组类型之外任何一个正当数据类型,包含普通类型、指针类型和引用类型等。

函数返回值通常指明了该函数处理结果,由函数体中return语句给出。一个函数能够有返回值,也能够无返回值(称为无返回值函数或无类型函数)。此时需要使用保留字void作为类型名,而且函数体中也不需要再写return语句,或者return后面什么也没有。 每个函数都有类型,假如在函数定义时没有明确指定类型,则默认类型为int。

年3月10第10页5.2.1函数定义(续) 函数名是一个有效C++标识符,遵照普通命名规则。在函数名后面必须跟一对小括号“()”,用来将函数名与变量名或其它用户自定义标识符区分开来。在小括号中能够没有任何信息,也能够包含形式参数表。C++程序经过使用这个函数名和实参表能够调用该函数。

主函数名称要求取编译器默认名称main()。年3月11第11页5.2.1函数定义(续) 形式参数表又称参数表,写在函数名后面一对圆括号内。它可包含任意多个(含0个,即没有)参数说明项,当多于一个时其前后两个参数说明项之间必须用逗号分开。 每个参数说明项由一种已定义数据类型和一个变量标识符组成,该变量标识符称为该函数形式参数,简称形参,形参前面给出数据类型称为该形参类型。每个形参类型可认为任一种数据类型,包含普通类型、指针类型、数组类型、引用类型等。 一个函数定义中<参数表>可以被省略,表明该函数为无参函数,若<参数表>用void取代,则也表明是无参函数,若<参数表>不为空,同时又不是保留字void,则称为带参函数。年3月12第12页5.2.1函数定义(续)

<函数体>是一条复合语句,它以左花括号开始,到右花括号结束,中间为一条或若干条C++语句,用于实现函数执行功效。

注意:在一个函数体内允许有一个或多个return语句,一旦执行到其中某一个return语句时,return后面语句就不再执行,直接返回调用位置继续向下执行。

年3月13第13页5.2.1函数定义(续)函数形参也能够在函数体外说明。以下例:func1(inta,intb){

…}也可写成:func1(a,b)inta;intb;{…}年3月14第14页5.2.1函数定义(续)#include"iostream.h"intfunc(intn){if(n>0)return1;elseif(n==0)return0;elsereturn-1;}

voidmain(){intn;cout<<"Pleaseinputn:"<<endl;cin>>n;cout<<"\ntheresult:"<<func(n)<<endl;}例5-1:给出以下程序运行结果。年3月15第15页5.2.1函数定义(续)此程序运行结果为:Pleaseinputn:2

theresult:1Pleaseinputn:-2

theresult:-1年3月16第16页5.2.1函数定义(续)

请注意:C++中不允许函数定义嵌套,即在函数定义中再定义一个函数是非法。一个函数只能定义在别函数外部,函数定义之间都是平行,相互独立。 比如:下面代码在主函数中非法嵌套了一个f()函数定义:voidmain(){voidf(){//…}}

年3月17第17页5.2.2函数申明 函数申明也称函数模型(或函数原型)。在主调函数中,假如要调用另一个函数,则须在本函数或本文件中开头将要被调用函数事先作一申明。申明函数,就是告诉编译器函数返回类型、名称和形参表组成,方便编译系统对函数调用进行检验。 函数申明普通格式为: 函数类型函数名(形式参数表); 除了需在函数申明末尾加上一个分号“;”之外,其它内容与函数定义中第一行(称函数头)内容一样。年3月18第18页5.2.2函数申明(续)比如:设有一函数定义为:doublefunc1(doublea,intb,floatc){

函数体}正确完整函数申明应为:doublefunc1(doublex,inty,floatz);//末尾要加上分号

年3月19第19页5.2.2函数申明(续)也能够写为以下形式:doublefunc1(double,int,float); //函数申明中省略了形参名或写为以下形式:doublefunc1(doublea,intb,floatc);

//函数申明中形参名与

//函数定义中形参名不一样年3月20第20页5.2.2函数申明(续)不能写为以下形式:

doublefunc1(x,y,z); //函数申明中省略了形参类型

或:func1(doublex,inty,floatz);

//函数申明中省略了函数类型

或:doublefunc1(inty,floatz,doublex);

//函数申明中形参次序调换了

年3月21第21页5.3函数调用

5.3.1函数调用格式: 在C++中,除了主函数main由系统自动调用外,其它函数都是由主函数直接或间接调用。函数调用语法格式为:

函数名(实际参数表); 实参应该与函数定义中形参表中形参一一对应,即个数相等、次序一致且对应参数数据类型相同或相容。每个实参是一个表示式,而且必须有确定值。

年3月22第22页5.3.1函数调用格式:如:g1(25) //实参是一个整数g2(x) //实参是一个变量g3(a,2*b+3) //第一个为变量,第二个运算表

//达式g4(sin(x),’@’) //第一个为函数调用表示式,第二

//个为字符常量g5(&d,*p,x/y-1) //分别为取地址运算、间接访问和

//普通运算表示式

年3月23第23页5.3.1函数调用格式(续) 常见函数调用方式有以下两种:方式一:将函数调用作为一条表示式语句使用,只要求函数完成一定操作,而不使用其返回值。若函数调用带有返回值,则这个值将会自动丢失。比如:

max(3,5);方式二:对于含有返回值函数来说,把函数调用语句看作语句一部分,使用函数返回值参加对应运算或执行对应操作。比如:

inta=max(3,5); inta=max(3,5)+1; cout<<max(3,5)<<endl; if(f1(a,b))cout<<”true”<<endl; inta=2;a=max(max(a,3),5);

年3月24第24页5.3.1函数调用格式(续)#include<iostream.h>intmax(inta,intb,intc){intt;t=a;if(b>t)t=b;if(c>t)t=c;returnt;}voidmain(){intx,y,z;cout<<”Pleaseinputxyz:”<<endl;cin>>x>>y>>z;intm=max(x,y,z);cout<<”Themaxis:”<<m<<endl;}例5-2:函数调用。年3月25第25页5.3.2函数调用过程

当调用一个函数时,整个调用过程分为三步进行,第一步是参数传递,第二步是函数体执行,第三步是返回,即返回到函数调用表示式位置。

年3月26第26页5.3.3函数调用时参数传递 参数传递称为“实虚结合”,即实参向形参传递信息,使形参含有确切地含义(即含有对应存放空间和初值)。这种传递又分为两种不一样方式,一个是按值传递,另一个是地址传递或引用传递。

年3月27第27页5.3.3函数调用时参数传递(续)1.按值传递

以按值传递方式进行参数传递过程为:首先计算出实参表示式值,接着给对应形参变量分配一个存放空间,该空间大小等于该形参类型长度,然后把已求出实参表示式值一一存入到为形参变量分配存放空间中,成为形参变量初值,供被调用函数执行时使用。这种传递是把实参表示式值传送给对应形参变量,故称这种传递方式为“按值传递”。这种方式被调用函数本身不对实参进行操作,也就是说,即使形参值在函数中发生了改变,实参值也完全不会受到影响,仍为调用前值。年3月28第28页5.3.3函数调用时参数传递(续)#include"iostream.h"voidswap(int,int);voidmain(){inta=3,b=4;cout<<"a="<<a<<",b=“<<b<<endl;swap(a,b);cout<<"a="<<a<<",b="<<b<<endl;}

voidswap(intx,inty){intt=x;x=y;y=t;}此程序运行结果为:a=3,b=4a=3,b=4例5-3:按值传递。

年3月29第29页5.3.3函数调用时参数传递(续)2.地址传递

假如在函数定义时将形参类型说明成指针,对这么函数进行调用时就需要指定地址值形式实参。这时参数传递方式即为地址传递方式。这种地址传递与上述按值传递不一样,它把实参存放地址传送给对应形参,从而使得形参指针和实参指针指向同一个地址。所以,被调用函数中对形参指针所指向地址中内容任何改变都会影响到实参。

年3月30第30页5.3.3函数调用时参数传递(续)#include"iostream.h"voidswap(int*,int*);voidmain(){inta=3,b=4;cout<<"a="<<a<<",b=“<<b<<endl;swap(&a,&b);cout<<"a="<<a<<",b=“<<b<<endl;}

voidswap(int*x,int*y){intt=*x;*x=*y;*y=t;}

此程序运行结果为:a=3,b=4a=4,b=3例5-4:地址传递。

年3月31第31页5.3.3函数调用时参数传递(续)3.引用传递 按值传递方式轻易了解,但形参值改变不能对实参产生影响;地址传递方式即使能够使得形参改变对对应实参有效,但假如在函数中重复利用指针进行间接访问,会使程序轻易产生错误且难以阅读。假如以引用作为参数,则既能够使得对形参任何操作都能改变对应实参数据,又使函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。年3月32第32页5.3.3函数调用时参数传递(续)#include"iostream.h"voidswap(int&,int&);voidmain(){inta=3,b=4;cout<<"a="<<a<<",b=“<<b<<endl;swap(a,b);cout<<"a="<<a<<",b=“<<b<<endl;}voidswap(int&x,int&y){intt=x;x=y;y=t;}

此程序运行结果为:a=3,b=4a=4,b=3例5-5:引用传递。

年3月33第33页5.3.4内联函数

内联扩展(inlineexpansion)简称为内联(inline),内联函数也称为内嵌函数。当在一个函数定义或申明前加上关键字inline则就把该函数定义为内联函数,它主要是处理程序运行效率。 计算机在执行普通函数调用时,不论该函数多么简单或复杂,都要经过参数传递、执行函数体和返回等操作,这些操作都需要一定时间开销。若把一个函数定义为内联函数后,在程序编译阶段,编译器就会把每次调用该函数地方都直接替换为该函数体中代码,由此省去函数调用及对应保留现场、参数传递和返回操作,从而加紧整个程序执行速度。

年3月34第34页5.3.4内联函数(续)例5-6:#include"iostream.h"inlineintabs(intx){returnx<0?-x:x;}voidmain(){inta,b=3,c,d=-4;a=abs(b);c=abs(d);cout<<"a="<<a<<",c="<<c<<endl;}此程序运行结果为:a=3,c=4年3月35第35页5.3.4内联函数(续)

内联函数能够在一开始仅定义或申明一次,但必须在函数被调用之前定义或申明。不然,编译器不认为那是内联函数,依然如同对普通函数那样处理该函数调用过程 从用户角度看,调用内联函数和普通函数没有任何区分。

请注意:内联函数函数体有一些限制:内联函数中不能含有任何循环以及switch和goto语句;内联函数中不能说明数组;递归函数(自己调用自己函数)不能定义为内联函数。

年3月36第36页5.3.5重载函数

函数重载又称为函数多态性,是指同一个函数名对应着多个不一样函数。所谓“不一样”是指这些函数形参表必须互不相同,或者是形参个数不一样,或者是形参类型不一样,或者是二者都不相同,不然将无法实现函数重载。比如,下面是正当重载函数:

intfunc1(int,int); intfunc1(int); doublefunc1(int,long); doublefunc1(long);

年3月37第37页5.3.5重载函数(续)

重载函数类型,即函数返回类型能够相同,也能够不一样。但假如仅仅是返回类型不一样而函数名相同、形参表也相同,则是不正当,编译器会报“语法错误”。如:

intfunc1(inta,intb); doublefunc1(inta,intb);

除类型外都相同情况,编译器不认为是重载函数,只认为是对同一个函数原型屡次申明。 在调用一个重载函数func1()时,编译器必须判断函数名func1到底是指哪个函数。它是经过编译器,依据实参个数和类型对全部func1()函数形参一一进行比较,从而调用一个最匹配函数。

年3月38第38页5.3.6带默认形参值函数

在C++语言中调用函数时,通常要为函数每个形参给定对应实参。若没有给出实参,则按指定默认值进行工作。

当一个函数现有定义又有申明时,形参默认值必须在申明中指定,而不能放在定义中指定。只有当函数没有申明时,才能够在函数定义中指定形参默认值。

年3月39第39页5.3.6带默认形参值函数(续) 默认值定义必须恪守从右到左次序,假如某个形参没有默认值,则它左边参数就不能有默认值。 如:voidfunc1(inta,doubleb=4.5,intc=3);//正当voidfunc1(inta=1,doubleb,intc=3);//不正当

在进行函数调用时,实参加形参按从左到右次序进行匹配,当实参数目少于形参时,假如对应位置形参又没有设定默认值,就会产生编译错误;假如设定了默认值,编译器将为那些没有对应实参形参取默认值。

年3月40第40页5.3.6带默认形参值函数(续) 注意:形参默认值能够是全局常量、全局变量、表示式、函数调用,但不能为局部变量。 比如,下例不正当:voidfunc1(){intk;voidg(intx

温馨提示

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

评论

0/150

提交评论