第三章 函数和函数模板.ppt
第三章 函数和函数模板 C++程序设计 1 本章主要内容 l 函数的定义与声明 l 函数的参数传递 l 函数返回值 l 内联函数 l 函数的重载 l 函数模板 2 l 在以模块化方式设计一个较大的程序 时,需要对复杂功能进行分解,形成若 干容易处理和编码的相对独立的程序块 ,而最终要精心实现的就是这些小而容 易的程序块,称为 “模块 ”, C++中称之 为 函数 。 函数的定义与声明 3 函数的定义与声明 l 函数是面向对象程序设计中,对功能的 抽象,体现了代码的可重用性。 l 函数声明的语法形式 返回值类型 函数名(形式参数表) { 语句序列 } 是被初始化的内部 变量,寿命和可见 性仅限于函数内部 若无返回值,写 void 4 函数的定义与声明 int result(int a,int b){ int c(0); c=a+b; return c; } 5 函数的定义与声明 l 函数的参数分为: 形参 与 实参 形参 :在函数定义的时候所使用的参数 viod Test(int a,int b){…….} 实参 :在函数被调用时传入的参数 int x=3; int y=5; Test(x,y); 6 l 形式参数表 name1, name2, ., namen l 函数的返回值 –由 return 语句 给出,例如: return 0 –无返回值的函数( void类型 ),不必写 return语句。 函数的定义与声明 7 函数的定义与声明 l 一个程序中可能包含很多个函数,所有函数无主 次之分,单独定义, 不能在一个函数的函数体内再 定义另一个函数, 这一点称为函数的 “ 外部性 ” 。 l 一个完整的程序必须有一个名字为 main的函数, 它起着程序入口的作用。即程序从 main函数的第一 条语句开始执行, main函数执行完毕意味着整个程 序运行结束。 8 函数的参数及其传递方式 l 如果仅给出一个函数的定义和声明, 并不意味着函数的代码能够被执行。只 有程序的其它部分使用该函数时,系统 才会真正执行函数的代码,这种使用称 为 “ 函数调用 ” 。 9 函数的参数及其传递方式 l 调用前先声明函数原型: –在调用函数中,或程序文件中所有函数之外,按 如下形式说明: 类型标识符 被调用函数名 (含类型说明的形参表) ; void result(int ,int ); l 调用形式 函数名(实参列表) result(22,33); 10 函数的参数及其传递方式 11 函数的参数及其传递方式 l 在函数被调用时才分配形参的存储单元。 l 实参可以是常量、变量或表达式。 l 实参类型必须与形参相符,包括 数量、 类型、顺序 。 12 函数的参数及其传递方式 l 函数参数的传递分为: 传值 与 传引用 传值 :传递的是参数的值 传引用 :传递的是参数的地址 传值又可以细分为 传递普通数据 和 指 针 形式参数的改变与实际参数无关,即 形参的变化不会影响实参变量的值 13 函数的参数及其传递方式 l 对象作为函数参数 将 实参的值传递给形参 对象,是单向传 递,这种传递方式不会影响原来实参的值。 直接使用基本数据类型的对象、类和结 构的对象作为参数传递,都是 传值 方式 14 函数的参数及其传递方式 #include using namespace std; void Swap(int a, int b); int main() { int x(5), y(10); cout using namespace std; void Swap(int int main() { int x(5), y(10); cout l int result(int ,int ); l void main(){ l int z(0); l z=result(22,33); l cout using namespace std; int a[ ]={2,4,6,8}; int void main(){ index(2)=20; cout using namespace std; int max(int ,int ); void main(){ coutb)?a:b; } 28 内联函数 l 在发生一次函数调用时,意味着环境保护 、参数交换、执行被调用函数代码和恢复调 用前环境等一系列操作,这些额外开销使得 函数调用比直接执行函数体代码的效率要低 一些。为了提高代码运行效率,可将函数定 义为内联函数。 l 方法是将 inline加在函数定义和声明之前, 如: inline int max(int a, int b) { return a b ? a : b ; } 29 内联函数 l 如果一个函数被指定为内联函数,它 将在程序中每个调用点上被内联地展开 。例如: int maxV = max(5,7)+max(i, j); l 在编译时被展开为: int maxV = (5 7 ? 5 : 7)+(i j ? i : j); 30