第一学期课堂内容15周_第1页
第一学期课堂内容15周_第2页
第一学期课堂内容15周_第3页
第一学期课堂内容15周_第4页
第一学期课堂内容15周_第5页
已阅读5页,还剩29页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

函

数3.6

函数调用机制3.5

函数的重载、默认参数、内联变量的存储机制与C++的内存布局自由存储区—堆区(动态数据)栈区(函数局部数据)main()函数局部数据全局数据区(全局变量、静态变量)代码区(程序代码)函数调用机制每当函数调用发生时,系统都会做以下工作:建立栈空间。保护现场。将当前主调函数的执行状态和返回地址保存在栈中。为被调函数中的局部变量(包括形参)分配栈空间,并将实参值传递给形参。执行被调函数直至返回语句或函数结束处。释放被调函数的所有局部变量栈空间。恢复现场。取出主调函数的执行状态及返回地址,释放栈空间。返回到调用函数继续执行。3.5

函数的重载重载:几个函数的功能相似但参数类型不同,这几个函数可以使用相同的函数名,即函数重载。求和函数对应不同的参数类型可以定义如下几个重载函数:int

sum(int

a,int

b)double

sum(double

a,double

b)float

sum(float

a,float

b,float

c)3.5.4

函数重载重载匹配:当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函数。匹配过程按如下步骤进行:如果有严格匹配的函数,就调用该函数;参数内部转换后如果匹配,调用该函数;通过用户定义的转换寻求匹配。#include

<iostream>

//请调试下面的代码,观察调用哪个函数?using

namespace

std;int

sum(int

a,int

b){return

a+b;}double

sum(double

a,double

b){return

a+b;}float

sum(float

a,float

b,float

c){return

a+b;}void

main(){cout<<sum(2,3)<<endl;float

a,b;[例1]定义三个函数,分别求两个整数的最大值、两个双精度实数(double)的最大值、三个单精度实数(float)的最大值。补充

默认参数默认参数指在定义函数时为形参指定默认值(缺省值)。这样的函数在调用时,对于默认参数,可以给出实参值,也可以不给出参数值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按默认值进行调用。【例2】默认参数--读程序int

fun(int

a=10,int

b=20){return

a+b;}intmain(){cout<<fun()<<endl;

//不给出实参,调用时使用默认参数intx,y;cout<<"请输入两个整数:"<<endl;cin>>x>>y;cout<<fun(x,y)<<endl;return

0;}默认参数使用要点:默认参数可以有多个,但所有默认参数必须放在参数表的右侧,即先定义所有的非默认参数,再定义默认参数。这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性。在同一个作用域中一个参数只能被指定一次默认值,不可以在声明和定义中同时指定默认值,即使默认值一样也不行。

int

fun(int

a,int

b=10,int

c=20);//函数声明中给出缺省值。参数名也可省略int

fun(int

a,

int

b,int

c){…}//函数的定义中不再给出缺省值【例3】在同一个作用域中一个参数只能被指定一次默认值,不可以在声明和定义中同时指定默认值,即使默认值一样也不行。#include

<iostream>using

namespace

std;int

fun(int

a,int

b=20) //函数定义{return

a+b;}int

main(){cout<<fun(5)<<endl;

//只给出一个实参,调用时另一个使用默认参数int

x,y;cout<<"请输入两个整数:"<<endl;cin>>x>>y;cout<<fun(x,y)<<endl;return

0;}#include

<iostream>using

namespace

std;int

fun(int

a,int

b=20);//函数声明

int

main(){cout<<fun(5)<<endl;

//不给出实参,调用时使用默认参数int

x,y;cout<<"请输入两个整数:"<<endl;cin>>x>>y;cout<<fun(x,y)<<endl;return

0;}//函数定义int

fun(int

a,int

b){return

a+b;}3.5.5

内联函数内联函数的引入:当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。当函数功能简单,使用频率很高,为了提高效率,直接将函数的代码嵌入到程序中(编译器为内联函数生成一份代码副本,并将其插入到函数调用处)。但这个办法有缺点,一是相同代码重复书写,二是程序可读性往往没有使用函数的好。为了协调好效率和可读性之间的矛盾,C++提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。3.5.5

内联函数【例4】读入一行字符串,找出其中的数字字符.要求定义一个内联函数,判断一个字符是否为数字字符。#include

<iostream>using

namespace

std;inline

int

IsNumber(char

c)//因使用频度很高,说明为内联函数。{return

c>='0'

&&

c<='9'?1:0;}intmain(){char

ch;while((ch=cin.get())!=

'\n')if

(IsNumber(ch)==1)

cout<<ch;return

0;}3.5.5

内联函数内联函数的调用机制与一般函数不同,编译器在编译过程中遇到inline时,为该函数建立一段代码,而后在每次调用时直接将该段代码嵌入到调用函数中,从而将函数调用方式变为顺序执行方式,这一过程称为内联函数的扩展或内联。函

数3.6.4存储类型与标识符的生命期结合多文件结构4.8头文件与多文件结构补充结构(体)3.6.4

存储类型与标识符的生命期存储类型决定标识符的存储区域,即编译器在不同区域为不同存储类型的标识符分配空间。存储区域不同,标识符的生命期也不同。生命期指标识符从获得空间到空间被释放之间的时间。变量的存储类型自动存储类型(auto)一般缺省(存储在栈中)生命期与作用域一致,块开始执行时系统自动分配空间,块结束时系统自动释放空间。register-----寄存器型(不提倡)静态存储类型:static外部存储类型:extern*变量定义格式:

[存储类型]

数据类型 变量表;int

sum;auto

int

a,b,c;register

int

i;x,y;static

floatextern

int

k;voidmain(){void

increment();//函数声明语句

increment();increment();increment();}void increment()

//函数定义--函数头{intx=0;

//默认为auto存储类型

x++;cout<<x<<endl;}【例5】局部静态变量值具有可继承性运行结果:111int

n;voidmain(){void

increment();increment();increment();increment();}void

increment(){static

int

x=0;

//等价于static

int

x;x++;cout<<x<<endl;}运行结果:123注意:静态变量存储在全局数据区,未赋初值等效于初始化为0。局部静态变量具有局部作用域,但却拥有全局生命期。

它占用的空间在整个程序执行结束时才释放。3.外部存储类型一个C++程序可以由多个源程序文件组成。在一个程序文件中定义的全局变量和函数默认为外部的,即其作用域可以延伸到程序的其他文件中。但其他文件若要使用这个文件中定义的全局变量和函数,则应该在使用前用extern进行外部声明。外部声明通常放在文件的开头(函数中通常省略extern)情况一:一个函数使用到定义在该函数之后的全局变量,也必须对使用到的

全局变量进行外部变量声明,所以全局变量最好集中定义在文件的起始部分。int

max(int x,

int

y){returnx>y?x:y;}voidmain(){extern

int

a,b;cout<<max(a,b);}int

a=13,b=-8;情况二:两个源文件(.cpp)分别使用到其他文件中的变量及函数。注意—只能有一个文件中包含main函数。【例6】外部存储类型的例子。/*

Ex6_1.cpp

*/#include

<iostream>using

namespace

std;void

fun2(); //等价于extern

void

fun2();int

n;void

main(){n=1;fun2();cout<<"n="<<n<<endl;}运行结果:n=3/*Ex6_2.cpp*/externint

n;voidfun2(){n=3;}【例7】课本例3-24程序代码://文件名mainFun.cpp#include

<iostream>using

namespace

std;//extern型外部变量//静态外部变量,仅在本文件中可见intx=100;static

int

y=5;void

subFun();int

main(){for(int

i=0;i<y;i++){subFun();cout<<"全局变量x的值为"<<x<<endl;}return

0;}//文件名subFun.cpp#include

<iostream>using

namespace

std;//引用外部//错误!在程extern

int

x;//extern

int

y;void

subFun(){static

int

n;//静态局n++; //调用一次x+=5;cout<<"subFun函数被}4.8

多文件结构4.8.1

头文件标准库 头文件:考虑标识符在其他文件中的可见性。使用头文件是很有效的方法。如:#include<iostream>using

namespace

std;其中iostream是在标准名字空间域std中定义的头文件。对应的传统方式的文件名为<iostream.h>,头文件以“.h”为后缀。C++系统提供了常用的函数库。头文件中包含了一些常用函数。安装路径D:\Program

Files\Microsoft

Visual

Studio

10.0\VC\include头文件自定义头文件:除了系统定义的头文件外,用户还可以自定义头文件。多文件结构在开发较大程序时,通常将其分解为多个源程序文件,每个较小的程序用一个源程序文件建立。程序经过建立、编译、连接,成为一个完整的可执行程序。多文件结构通过项目进行管理,在项目中建立若干用户定义的头文件.h和源程序文件.cpp。头文件中定义用户自定义的数据类型,所有的程序实现则放在不同的源程序文件中。编译时每个源程序文件单独编译,如果源程序文件中有编译预处理指令,则首先经过编译预处理生成临时文件存放在内存,之后对临时文件进行编译生成目标文件.obj,编译后临时文件撤销。所有的目标文件经连接器连接最终生成一个完整的可执行文件.exe。图1是一个多文件系统的开发过程。多文件结构编译预编译编译预编译预编译编译图1

C++程序开发过程file1.cppfile1.hfile2.cppfile2.hfilen.cppfilen.h…临时文件1临时文件2临时文件n…file1.objfile2.objfilen.obj…Filename.exe.lib

C++标准类库连接运行【例8】

:多文件结构示例建立一个头文件area.h,在其中定义两个面积函数area(),分别用来计算半径为r的圆的面积和边长为a和b的矩形面积。另外建立一个实现文件area.cpp,在其中定义主函数。通过包含area.h,接收用户输入的数据并显示圆和矩形的面积。注意:当前路径下包括文件area.h,应为#include

"area.h“#include<area.h>到include文件夹中寻找area.h补充结构(体)结构(体)结构是一种构造数据类型

(数组属构造类型)用途:把不同类型的数据组合成一个整体-------自定义数据类型–

结构类型定义struct

[结构类型名]{类型名

变量名;类型名

变量名;…………….};变量类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体C++只为结构安排公有的数据成员。例

struct

student{int

num;char

name[9];char

sex;int

age;float

score;char

addr[30];};结构类型定义描述结构的组织形式,不分配内存2.结构变量的定义先定义结构类型,再定义结构变量一般形式:struct

结构类型名{类型名

变量名;类型名

变量名;…………….例

struct

student};[struct]

结构名变量名表列;{ int

num;char

name[9];char

sex;int

age;float

score;char

addr[30];};[struct]

student

stu1,stu2;–定义结构体类型的同时定义结构体变量一般形式:struct

结构类型名{类型名类型名变量名;变量名;…………….}变量名表列;例

struct

student{ int

num;char

name[9];char

sex;int

age;float

score;char

addr[30];}stu1,stu2;3.结构体变量的引用引用规则结构变量不能整体引用,只能引用变量成员 引用方式:

结构变量名.成员名算符右成员(分量)运优先级:1结合性:从左向例

struct

student{int

num;char

name[20];char

sex;int

age;float

score;char

addr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;【例9】定义结构类型student,描述学生信息:姓名、年龄、性别。通过结构成员完成信息的输入与输出。char

sex; //可以使用f表示女,用m表示男struct

student

s;//student

s;cout<<"请输入该同学的姓名:"<<endl;cin.getline(,9);

//输入的名字小于9个字符cout<<"请输入该同学的年龄:"<<endl;cin>>s.age;cout<<"请输入该同学的性别:"<<endl;cin>>s.sex;cout<<setw(6)<<<<setw(6)<<s.age<<setw(6)<<s.sex<<endl;#include

<iostream>#include

<iomanip>using

namespace

std;struct

student{char

name[9];int

age;•};void

main(){••••••••}4.结构体变量的初始化struct

student{ int

num;char

name[9];char

sex;int

age;char

addr[30];};student

stu1={112,“Wang

Lin”,‘M’,19,

“200

Beijing

Road”};struct

student{ int

num;char

name[9];char

sex;int

age;char

addr[30];}stu1={112,“Wang

Lin”,‘M’,19,

“200

Beijing

Road”};4.结构数组–结构数

温馨提示

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

评论

0/150

提交评论