您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > visualstudio学习第5章函数
在开发较大的程序时,经常需要把程序分解为若干个程序模块,每一个模块实现一个特定的功能。在C++程序中,函数就是一个基本的程序模块。在前面的程序中,都是在自己编写的主函数main(),有时还会调用标准库中的一些函数。本章将介绍如何定义自己的函数。声明并编写自己的C++函数函数的参数函数的调用函数和数组的使用变量的作用域函数模板C++/CLI中的函数和泛型函数从用户使用的角度看,函数有两种:标准函数和自定义函数。标准函数也就是库函数,这是由系统提供的,用户不必自己定义这些函数,可以直接使用。自定义函数则是用户根据需求,自己编写的用于实现特定功能,这也是我们本章要介绍的函数类型。自定义函数也可以分为两种:无参函数在调用无参函数时,主调函数并不将数据传递给被调函数。无参函数一般是用来执行指定的操作。有参数函数在调用有参数函数是,在主调函数和被调函数之间有数据传递。也就是说,主调函数可以将数据传给被调函数使用,被调函数中的数据也可以带回来供主调函数使用。大多数情况下,在调用函数时,主调函数和被调函数之间有数据传递关系。主调函数通过参数将数据传递给被调函数,而被调函数则通过返回值向主调函数传递数据。在定义函数时,函数名后面括号中的变量名称为“形式参数”,简称“形参”,在主调节器函数中调用函数时,函数后面括号中的参数称为“实际参数”,简称“实参”。被调函数向主调函数传递数据的一种方法就是使用返回值。例如,在示例Exce5_01中,函数power(5.0,2)的返回值就是25,输出语句在命令行输出了这个值。函数的值只能通过return语句返回主调函数。return语句的一般形式为:return表达式;或者为:return(表达式);当函数执行时遇到return句,则该函数将结束执行立即返回到主调函数。在函数中允许有多个return语句,但每次调用函数只会有一个return语句被执行,因此也只会返回一个函数值。在定义函数时,如果在形参前添加const修饰符,则表示该参数不能在函数中以任何方式修改。前面已经说过,在程序中是通过对函数的调用来执行函数体的,函数调用的一般形式为:函数名(实参列表)如果函数是无参函数,则还可以省略实参列表。在调用函数时,程序的执行流程将从一块代码跳到另一块代码,并将实际参数传递过去;当被调用函数结束后,程序的执行流程返回会到原来的代码块继续执行,并返回函数的执行结果。为了管理函数调用过程中的数据传递和执行代码的控制转移,大多数程序语言使用栈来进行管理。栈是一种先进后出的数据结构,如果数据元素是以a1,a2,…,an的顺序进栈,则出栈的次序却是an,an-1,…,a1,如图5-2所示。栈的工作原理类似于在子弹匣中压子弹一样,最先压入弹匣的子弹要到最后才发射出去,而最后压入弹匣的子弹则最先被发射出去。栈的工作过程如右图所示。在编写程序时,应该在程序文件的开头为在程序中要使用的每个函数编写其函数原型,这样就不会因为函数的位置不正确而无法编译程序了。对于标准库函数,其函数的原型已经包含基其头文件中,因此在包含头文件后就不再需要函数原型。如果一个函数在被调用的过程中,又发生了直接或间接地调用它自己,这种现象称为函数的递归调用。递归是一种非常有效的数学方法,也是程序设计的一种重要算法。对某些问题的处理,采用递归的方法比非递归方法更为有效,或者能够更自然、更明显地反映出解决问题的过程。如果函数有多个参数,那么还给多个参数设置默认值,但是指定默认值的参数都必须放在参数列表的最后。因为,在调用函数时要使用参数的默认值,应省略相应的参数。如果省略参数列表中间的参数,则编译器将无法确定提供的实参所对应的形参。在前面定义的函数中,所使用的参数均为变量。由于数组元素也起到了变量的作用,因此数组元素也可以做为参数传递。另外,数组也可以用作函数的参数,此时并不会复制整个数组,而是将数组在内存中的地址传递给被调函数。这样,可以有效地减少因为复制大型数组而降低程序的性能。将整个数组作作函数参数,此时实参与形参都应用数组名,而且其类型应该一致。实际上,整个数组作函数参数传递的是数组的首地址,将实参数组的首地址传递给形参数组后,形参数组与实参数组将共享相同的存储单元,此时可以实现数据的双向传递。即在函数中改变形参数组的值后,主调函数的实参数组也将同时改变。在程序中定义变量时,由于定义变量的位置不同,决定了在程序的某处是否可以访问该变量。这就是变量的一个重要属性——作用域。只有在一个变量的作用域内,才可以合法地使用它。在一个变量的作用域外,是不能引用它的。根据变量的作用域不同,变量可以分为局部变量和全局变量。局部变量也称为内部变量。局部变量是在一个函数内定义的变量。其作用域仅限于函数内,离开该函数后就不能再使用该变量。全局变量也称为外部变量,它是在函数外部定义的变量。全局变量不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。在程序执行时,所有变量都有一个有限的生存期。从声明它们开始存在,在程序的某时该结束。变量的生存期由变量的存储方式决定,变量的存储方式可分为“静态存储”和“动态存储”两种。静态存储变量通常是在变量定义时就分定存储单元,并一直保持不变,直至整个程序结束。全局变量即属于此类存储方式。动态存储变量是在程序执行过程中,当需要使用它时才分配存储单元,使用完毕立即释放。如函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数执行完毕后立即释放。如果一个函数被多次调用,则会反复地分配、释放形参变量的存储单元。自动变量是在程序运行期间根据需要进行动态的分配存储空间。到目前为止,在函数内定义的所有局部变量都是自动变量,它们具有局部作用域。一个自动变量在其作用域中的时间从声明它的哪一刻开始,一直到包含其声明的代码块结束为止。自动变量起始于它被定义之时,它占用的空间在程序的栈内存空间上分配,并且在包含其定义的代码块结束时自动消失。每次执行包含一个自动变量声明的代码块时,这个变量就被重新创建。当一个自动变量消失时,它在栈上的内存将被释放,而由其他自动变量使用。静态变量的类型说明符为关键字static。静态变量属于静态存储方式。对于自动变量,也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。在局部变量的说明前再加上static说明符就构成静态局部变量。如果能实现相同功能的函数都使用相同的名称,同时在程序执行时还能执行合适版本的函数,这将解决相同功能的函数不能使用同名标识的难题。C++提供了这种机制,这就是函数重载。函数重载允许使用相同的名称定义多个函数,但是这些函数的形参列表不能相同。当调用函数时,编译器就会基于调用时提供的实参列表选择正确版本的函数。
本文标题:visualstudio学习第5章函数
链接地址:https://www.777doc.com/doc-2854945 .html