您好,欢迎访问三七文档
融智技术学院第9章函数的使用我们在前面编写的程序实例中基本上只有一个main函数,没有其他函数。而在实际应用中,在比较大的程序中,通常包含比较复杂的逻辑和功能,这些功能包含若干子功能,子功能可能分解出更小的子功能。这些功能组合在一起,才能形成完整的程序。在C++语言中,上述的这些功能模块是由函数来实现的。所谓函数就是一段可以实现某种功能的程序;这段程序相对独立,具有自己的输入和输出,可以被重复调用,类似一个“黑匣子”。融智技术学院第9章函数的使用融智技术学院9.1函数的概念在C++中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就是程序中的函数。我们可以将函数看作是程序员自己定义的操作。与内置操作符相同的是每个函数都会实现一系列的计算,然后形成一个计算结果。与操作符不同的是,函数有自己的函数名,而且函数的操作数是没有数量限制的。函数也是可以重载的,所以这意味着同样的函数名可以对应多个不同的函数,实现更加多元化的功能。融智技术学院9.2函数的声明函数必须首先声明然后使用,正如变量必须首先声明然后使用一样。函数的声明也可以和函数的定义相分离,一个函数可以声明多次,但是只能定义一次。当函数体的定义都是位于main函数之前时,可以顺利进行编译。但如果将函数定义部分放到函数调用语句之后时编译是否可以进行呢?严格来说,这样的编译过程应该不能通过。我们可以分析编译器的编译过程。编译器编译一个C++源文件时,采取从前向后的顺序进行。如果函数定义在前,那么编译器处理完函数定义部分后,自然了解了该函数的参数类型、个数和返回值等信息,那么后续的代码中遇到该函数的调用,编译器自然可以轻松处理;反之,编译器遇到一个函数的调用,但尚未编译该函数的定义,对该函数“一无所知”,那么编译器可能就会报错。融智技术学院9.3函数的定义函数是由函数名以及一组操作数表示的。函数的操作数也可以称为是形参,在一对圆括号中声明的,形参与形参之间可以用逗号分割开。函数所执行的实现功能的运算是在一个称为函数体的块语句中定义的。每一个函数都有一个返回类型。我们在编写程序过程中会遇到无参函数和有参函数等类型,它们的定义相互之间是有一定的区别的。融智技术学院9.3.1不同函数类型的定义形式无参函数很明显就是一种没有参数的函数,定义无参函数的一般形式如下:函数返回值类型函数名(){定义部分语句部分}融智技术学院9.3.2函数的返回值函数的返回值是通过函数中的return语句获得的,return语句将被调用函数中的一个确定值带回到主调函数之中去,而如果需要从被调用函数中带回一个函数值供主调函数使用,则在函数定义体中必须要包含return语句。一个函数中可以包含多个return语句,执行到哪个语句哪个起作用。return语句的后面可以是一个值也可以是可以得出值的表达式。例如:intget_bigger(inta,intb){return(xy?x:y);}融智技术学院9.3.3函数的形参表形参表是一系列用逗号分隔的参数类型和参数名组成的,如果两个参数具有相同的类型,其类型也必须重复进行声明。intget_bigger(inta,intb,intc);//正确的用法intget_bigger(inta,b,c);//错误的用法函数的形参表可以是空的,没有形参的函数可以用空的形参表或者在形参表中写上void来表示。下面的两种表示是相同的:voidprint_now();voidprint_now(void);融智技术学院9.4函数的参数传递每次调用函数的时候,都会重新创建被调用函数所有的形参,这个时候主调函数的位置传递的实参就会重新初始化被调用函数所有对应的形参。注意如果形参是非引用类型,则复制实参的值,如果形参为引用类型则它只是实参的别名,并不会赋值实参的值。有关概念将会在下面的章节中讲解。融智技术学院9.4.1形式参数与实际参数在有参函数中,在调用函数的时候,主调函数和被调用函数之间有数据传递关系。在定义函数的时候函数名后面括号中的变量名称为形式参数,也就是形参;在主调函数中调用一个函数的时候,函数名后面括号中的参数称为实际参数,也就是实参。融智技术学院9.4.2非引用形参在C++中实参向形参的数据传递是值传递。在调用函数的时候,才会给形参分配存储单元,并将实参对应的值传递给形参,调用结束后形参单元才会被释放,而实参单元仍保留并维持原值。融智技术学院9.4.3引用形参在上一节中我们学习了一种函数中的普通的参数传递情况,这种情况下改变形参是不能影响实参的值的。那么如何实现通过改变形参的值直接改变实参的值的效果呢?这就需要设置引用形参了。使用引用形参应当注意以下几点:1.使用const引用形参可以避免复制实参为局部副本2.传递指向指针的引用融智技术学院9.5函数的调用函数调用的形式为:函数名(实参列表);当调用无参函数的额时候实参列表是可以没有的,只写一个空的圆括号即可。如果实参列表包含有多个实参时,则各个参数之间使用逗号隔开,注意实参和形参的个数应该相等而且类型也应当匹配或者能相互转换。函数调用的一般有三种情况。第一种情况就是当不需要函数带回一定的返回值时,将函数调用看成一个语句。第二种情况是函数出现在表达式之中,直接将函数的返回值作为表达式的一个操作数参与运算,这种情况中的函数需要带回返回值。第三种情况是直接将函数调用作为另一个函数调用的实参。融智技术学院9.6函数的嵌套调用在前面章节的学习中我们了解到,在C++中函数是不能嵌套定义的。但是函数是可以嵌套调用的。也就是说一个函数中可以调用另外一个函数。融智技术学院9.7内联函数在C语言中,提高称程序运行效率的一个方法是使用宏,宏可以不用普通函数调用就使之看起来像函数调用。宏的实现是用预处理器而不是编译器,而预处理器直接用宏代码代替宏调用,所以就节省了时间花费,所有的工作由预处理器完成,因此宏使程序调用的具有了便利性和可读性。在C++中引入了内联函数的概念,内联函数与带参数的宏有相似的地方。带参数的宏定义并不会对参数进行运算,而是直接对参数进行替换;而内联函数会首先对参数表达式进行运算然后再将参数表达式的值传递给形式参数。其实在C++中,宏的概念是作为内联函数来实现的,而内联函数无论在任何意义上都是真正的函数。唯一不同之处是内联函数在适当时像宏一样展开,所以函数调用的开销被取消。融智技术学院9.8变量的存储方式在C++中变量有两个属性,即数据类型和数据的存储方式。数据类型我们在前面的章节中已经进行了学习,现在我们来学习数据的存储方式。C++中数据的存储方式可以分为动态存储方式和静态存储方式两种。动态和静态是从变量生存期来分的。用静态存储方式保存变量的过程是:程序开始执行时,就从静态存贮区里分配内存空间给变量,程序结束后释放该变量。用动态存贮方式保存变量的过程是:程序在运行期间,根据需要为变量动态分配内存空间,使用结束后马上释放该变量的内存空间。融智技术学院9.9指针和函数指针在实际编程中是最使用的同时也是最难控制的,这令很多程序开发人员很烦恼,指针在函数中的使用更是彰显了指针强大的功能,在编程过程中,指针可以充当函数的形参也可以充当函数的返回值类型。在本节中将进行详细的讨论。融智技术学院9.9.1指针参数函数的形参可以是指针,这时将复制实参的指针,这种情况下参数的传递仍然是值传递,形参的任何改变仍然不能改变实参。如果函数将新的指针值赋值给形参,主调函数中所使用的实参指针的值是没有变化的。被复制的指针只是影响对指针的赋值,如果函数的形参是非const类型的指针,则函数可以通过指针实现赋值,修改在主调函数中指针所指向对象的值。融智技术学院9.9.1指针参数融智技术学院9.9.2指针作为返回值指针值也可以作为函数的返回值。这时定义函数返回值类型时需要将其定义成指针变量类型。指针作为函数返回值的一般形式为:函数返回值类型*函数名称(形参列表)例如:double*get_best(double(*pointer)[4],intn);融智技术学院9.9.2指针作为返回值融智技术学院9.10函数的重载如果两个函数具有相同的名字但是形参表不同,并且两者处于同一个作用域之中时,这两个函数就称为重载函数。为什么函数要重载呢?何时应该选择函数重载呢?当将要定义一组函数,并且需要使用这组函数执行一系列的操作,但是它们是应用在不同的参数类型上的。此时我们可以选择重载函数。例如:inta_max(int,int);//返回两个整数的最大值intb_max(constvectorint&);//返回int类型vector容器中的最大值intc_max(constvectordouble&);//返回double类型vector容器中的最大值融智技术学院9.10.1重载与作用域重载函数应当定义在同一个作用域中,这是为什么呢?因为当在局部作用域中定义一个函数,同样在全局作用域中也定义一个同名函数,则局部作用域中定义的函数将会屏蔽掉全局作用域中的函数,而不是进行重载。intMax(int,int);intmain(){intMax(int,int,int);intMax(double,int);}当在局部作用域中调用函数时,很明显只有局部作用域中定义的两个函数才能形成重载,这两个函数将全局作用域中定义的函数屏蔽了。当然所有的函数声明最好都放在头文件中,这样就不会出现由于作用域而相互屏蔽的错误。融智技术学院9.10.2默认参数在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时,就自动使用默认参数。在函数声明或定义时,直接对参数赋值。这就是默认参数;在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。融智技术学院9.10.3参数类型上不同的重载函数在C++中,可以根据函数参数的类型的差异来进行重载。融智技术学院9.10.4参数个数上不同的重载函数在C++中,可以根据函数参数的个数和顺序上的差异来进行重载。融智技术学院9.11本章小结在本章中我们学习了函数的相关知识。在C++中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就是程序中的函数。我们可以将函数看作是程序员自己定义的操作。函数必须首先声明然后使用。函数是由函数名以及一组操作数表示的。函数的操作数也可以称为是形参,在一对圆括号中声明的,形参与形参之间可以用逗号分割开。
本文标题:第9章 函数的使用
链接地址:https://www.777doc.com/doc-3843993 .html