函数定义和调用的格式
❖ 块作用域:局部变量只允许定义该变量的块中的语句访问,“块”一 般指复合语句,复合语句中位于变量定义之前的语句也不能访问该变 量
❖ 局部变量的存储类型: ① 自动变量:其生存期从变量定义开始,到所在块运行结束时为止, 用auto修饰或省略之 ② 寄存器变量:也是自动变量的一种,但它是存储于寄存器中的, 只有适合于单个寄存器存放的变量才可声明为寄存器变量,用 register修饰 ③ 静态变量:用static修饰的局部变量具有静态生存期,存在于应用 程序的整个运行期间
无返回值函数 2、“函数体”中最后语句可以为:Return; 也可 不用
函数调用
函数调用格式
函数名(实在参数表)
实参
与形参在数量、类型、次序上必须一致 类型不一致时,兼容的转换,不兼容的发生编译错误
作为表达式 1、必须是有返回值的函数
调
2、例:result=sqare(5.0);
用
方
1、可以没有返回值,有,也被舍弃不用
头文件
将C++应用程序中各个程序文件里面要调用的用户自定义函 数的原形说明放在一个头文件中,在有函数调用的程序文 件中包含这个头文件即可
多文件应用系统
❖ 第一个文件:描述函数的头文件 ❖ 第二个文件:定义函数的程序文件 ❖ 第三个文件:调用函数的主程序文件
参数传递
传值
把实参表达式的值作为一个副本传递给形参变量,函数调用不会改 变实参的值
函数访问该变量 ♥ 跨文件作用域:全局变量定义时未使用static修饰,则还允许同一系统
的其他程序文件中的函数访问该变量 ♥ 外部说明:extern int a 应用场合
① 跨文件作用域的全局变量被其他程序文件中的函数访问 ② 变量的声明在函数声明之后,称之为“变量的原形”
局部变量
❖ 局部变量:定义于函数内部的变量
函数模板的实例化:编译系统根据每次调用的实在参数的情况生成适当的 调用代码,并生成相应版本的函数定义,例:cout<<Max(3,5); int Max(int x,int y){return(x>y? x:y);}
static long add(long a,long b){return a+b;}
全局变量
♥ 全局变量:定义于函数外部的变量称为全局变量 ♥ 静态生存期:全局变量在应用程序运行的整个期间都有效,如果在定
义时未初始化,则自动初始化为0 ♥ 文件作用域:全局变量定义时使用static修饰,则只允许同一文件中的
内联展开:程序执行时,C++有可能直接调用函数体代码来替代对 函数的调用
函数说明:内联函数的说明也应放置在头文件中
函数重载与名字混成
函数重载:允许定义同名的函数,但重载的函数必须在参数的数量 上或类型上与其他同名函数有所不同
重载函数的调用:如果调用时所用的参数与所定义的各种情况均不 相同,则编译系统会选择与其兼容的最相似的那个函数,并完成必 要的类型转换,如果找不到兼容的函数,则产生编译错误
说明:对于数组参数,形参数组是对应的实参数组的代表,而不是它的 副本,因此,对形参数组的任何改变实际上就是对实参数组的改变
可选参数
♠ 在说明一个函数时,可以为形式参数表中的最后若干个参数设
定默认值,从而把这些参数设定为可选参数
♠ 在调用这个函数时,如果没有给出对应于可选参数的实参,系
统就自动以设定的默认值作为实参传递给这个函数
一维数组参数 1、在定义一个一维数组参数时,可以不限定数组元素的个数 2、在调用具有数组参数的函数时,须以单独的数组名为实在参数
二维数组参数
1、在定义一个二(或三)维数组参数时,其第一维可以不限定,但其 余各维都须限定
2、在调用具有数组参数的函数时,须以单独的数组名为实在参数
3、仅用行下标引用一个二维数组时,实际上引用的是相应行的那个 一维数组
♠ 在调用具有可选参数的函数时,被省略的只能是最后的连续的
若干个可选参数(即不能间隔省略)
♠ 可选参数的说明格式如下:
类型修饰符 变量名=默认值(常量表达式)
♠ 可选参数应该在函数原形中说明
内联函数
内联函数:在一般函数定义前面加上保留字inline,该函数即被说 明为内联函数,例: inline int add2(int n){return n+2;}
名字混成:编译系统在处理重载函数时会形成不同的内部名称,这 种方法称为名字混成
在重载函数时必须保证在逐个去掉可选参数后,仍然在参数个数上 或类型上与同名函数有所不同
函数的作用域
全局作用域:不但在定义函数的文件中可以调用,而 且在同一应用系统的其他程序文件中也可调用
文件作用域:说明为static的函数只能被同一文件中 的函数调用,例:
数
无参函数 “形式参数表”可以为空,也可用void
1、“类型修饰符”说明返回值的类型,为 Int 时可
以
省略,但不提倡 返 有返回值函数 2、“函数体”中最后一语句应为: Return 表达式;
回
3、函数的返回值应与“类型修饰符”的说明一致,
值Leabharlann 兼容的转换,不兼容的发生编译错误
1、“类型修饰符”必须为Void
第五章 C++函数
函数定义和调用的格式 函数原形和头文件的作用 参数传递机制、函数重载 函数和变量的作用域 函数模板的设计方法
函数的定义
函数定义的格式
类型修饰符 函数名(形式参数表){函数体} 例:double sqare(double n){return n*n;}
参
有参函数 各参数用逗号分隔,与变量说明方法相同
函数模板(一)
函数模板:一系列相关函数的模型或样板,这些函数的原代码除了因所针 对的数据类型不同而有所差异外,其基本结构相同。
定义格式:template <模板形参表>函数定义 例:
template<class T> // T被称之为虚拟类型 T Max(T x,T y) {
return (x>y? x:y); }
法 作为语句 2、调用语句后加语句结束符构成表达式语句
3、例:Hi();
sqare(5.0);
函数的递归调用
函数直接或间接地调用自身
函数原形与头文件
三种格式
函数定义 类型修饰符 函数名(形式参数表){函数体} 函数原形 类型修饰符 函数名(形式参数表); 函数调用 函数名(实在参数表)
一项原则:在调用函数时,函数必须经过定义或原形说明