函数——实现某一个数据处理操作的功能单元。
C++的函数相比较面向对象的函数来说是比较复杂的,C++中的函数就相当于面向对象中我们写的方法。接下来学习一下C++中的函数,以及函数的一个抽象——函数模板。
一 函数
1 函数参数
(1)C++的函数参数传递方式有俩种:传值和传引用。
1)传值:分为传变量值和传变量地址值。 2)传引用:传对象的地址。 注意:1 传地址值传递的是值,不是地址;传地址传的是地址不是地址值。 2 传递对象地址值是使用对象指针作为参数;传递地址是使用对象引用作为参数。 (2)函数参数类型 1)对象:将实参对象的值传递给形参对象,这种传递是单向的,形参拥有实参的备份。 特点:<1> 在函数中改变形参的值,改变的是备份的值不会影响实参的值,防止被调用函数改变参数的原始值。 <2> 不能讲数组的值作为函数参数,但可以将数组的地址值作为参数,即使用指针作为参数。 2)对象指针:将指向对象的指针作为函数参数,形参是对象指针,实参是对象的地址值。 特点:<1> 参数传递方式为传值方式 <2> 改变形参的值就是改变实参的值 <3> 采用传对象地址方式,要用到对象的指针,能提高运行效率 注意:数组名就是数组的指针名,数组可用传数组地址值的方式。 3)对象引用:实参对象名传给形参对象名,形参对象名就成为实参对象名的别 特点: <1> 实参对象和形参对象代表同一个对象,改变形参就是改变实参 <2> 实际是把实参对象的地址传给形参对象,形参对象和实参对象共享同一个单元,即为地址传递方式。 <3> 引用对象不是独立的对象,不单独占用内存单元,但是对象指针需要另外开辟内存单元,所以传引用比传指针更好。 注意:系统向形参传递的是实参的地址而不是实参的值,但实参必须使用对象名。 4)默认形式:不要求程序员设定该参数,由编译器在需要时给该参数赋默认值 特点:<1> 默认参数是在函数原型中说明的,默认参数可以多于1个,但必须放在参数序列的后部 int SaveName(char *first, char *second=" ",char *third=" ",char *fourth=" ");默认参数second、third、fourth必须放在参数序列first后面。这种方式表明,若不给出参数second、third、fourth的值,则取默认值空格。 <2> 如果一个默认参数需要指明一个特定值,则在其之前的所有参数都必须赋值。即要指明third为特定值,first和second必须赋值。 注意:const使用限制:const修饰传递参数表明函数只能使用该参数而不能修改。2 函数返回值
C++函数返回值类型可以是除数组和函数以为的任何类型,非void类型的函数必须向调用者返回一个值。数组只能返回地址。 (1) 返回值类型 1)引用:数据类型 & 函数名 (参数列表);将函数用在赋值运算符的左边。 2)指针:类型标识符 * 函数名 (参数列表);函数返回值为存储某种类型数据的内存地址,称之为指针函数。 3)对象:对象类型 函数名(参数列表);和基本函数差不多,只是返回类型为对象类型。 注意:当函数返回值为指针或引用对象时,函数返回所指的对象必须继续存在,因此不能将函数内部的局部对象作为函数的返回值,应该使用全局对象。 (2) 函数返回值作为函数的参数 函数返回值必须与新函数的参数的类型一致。3 特殊函数
(1)内联函数
1) 是什么? 用inline关键字修饰的函数。 2) 为什么? 使用内联函数能加快程序执行速度。 3)怎么用? <1> 除具有循环语句、switch语句的函数不能说明说明为内联函数,其他函数都可以。 <2> 函数体语句多,会增加程序代码的大小,一般不用内联函数。 <3> 内联函数必须在程序中第一次调用此函数的语句出现之前进行定义。(2)友元函数
1)是什么?
不是类成员却能访问类的所有成员的函数。
2)为什么?
在实现类之间数据共享时,减少系统开销,提高效率。为什么提出友元函数,依据定义而来,为了使其他类的成员函数直接访问该类的私有变量,即允许外面的类或函数去访问类的私有变量和保护变量,从而使俩个类共享同一函数。
3)怎么用?
运算符重载的某些场合需要使用友元函数。
俩个了类要共享数据的时候。
4)扩展:下面的链接,详细介绍了友元函数的一些知识。
http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html
4 函数重载
(1) 是什么? 函数重载是函数的一种特殊情况,可以是一个函数名具有多种功能,即具有多态性,函数的静态联编使用的就是函数重载,也叫做静态多态性。 (2) 为什么? 顾名思义,为了使同名函数具备不同功能。 (3) 怎么用? 使用要求:1)函数名相同 2)参数类型不同或参数个数不同 注意:函数返回值不同不能区分重载函数。二 函数模板
1 为什么引入: 为了解决程序文本一样,逻辑功能相同,只是数据类型不同的函数的使用。 2 怎么用: (1)函数模板实例化:函数模板与某个具体数据类型连用,产生模板函数的过程。 (2)函数模板的参数: 显式比较方式:函数模板名 <模板参数> (参数列表) 默认方式: 函数模板名 (参数列表) (3)显式规则和关键字typename重点理解函数参数以及返回值为引用还是指针,二者之间的区别于联系,在程序中又是如何体现的,同事也要掌握内联和友元函数的用法,以及函数模版的用法。