当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

第三章 函数和函数模板

发表于: 2011-09-09   作者:bsr1983   来源:转载   浏览次数:
摘要: 第3章 函数和函数模板 3.1 函数的参数及其传递方式 C语言函数参数的传递方式只有传值一种,传值又分为传变量值和传变量地址值两种情况。比较复杂的是结构变量,结构变量的值是指结构域中所有的变量值。在C++中,像int、float、double、char、bool等简单数据类型的变量,也是对象。类对象一般都包括数据成员和成员函数,如果在C++沿用C语言的说法,则对象的值

第3章 函数和函数模板

3.1 函数的参数及其传递方式

C语言函数参数的传递方式只有传值一种,传值又分为传变量值和传变量地址值两种情况。比较复杂的是结构变量,结构变量的值是指结构域中所有的变量值。在C++中,像intfloatdoublecharbool等简单数据类型的变量,也是对象。类对象一般都包括数据成员和成员函数,如果在C++沿用C语言的说法,则对象的值就是对象所有数据成员的值,约定参数传递中传递“对象值”是指对象的数据成员值,传递“对象地址值”是指对象的首地址值。C++函数还可以使用传递对象的“引用”方式,即它的函数参数有两种传递方式:传值和传引用。传引用其实就是传对象的地址,所有也称传地址方式。

参数传递中不要混淆传地址值和传地址的区别。传地址值传递的是值,不是地址;传地址传的是地址不是地址值。传递对象地址值是使用对象指针做为参数;传递地址时使用对象引用作为参数。

3.1.1 对象作为函数参数

将对象作为函数参数,是将实参对象的值传递给形参对象,这种传递是单向的。形参拥有实参的备份,当在函数中改变形参的值时,改变的是这个备份中的值,不会影响原来实参的值。

3.1.2 对象指针作为函数参数

将指向对象的指针作为函数参数,形参是对象指针(指针可以指向对象的地址),实参是对象的地址值。

注意:不要非要在主程序里产生指针,然后再用指针作为参数。函数原型参数的类型是指针,可以指针让它指向对象地址,即:

string *s1=&str1;

是完全正确的,使用&str1标识的是取对象str1的地址值,所以&str1直接作为参数即可。

3.1.3 引用作为函数参数

可以使用“引用”作为函数的参数(引用形参)。这时函数并没有对形参对象初始化,即没有指定形参对象是哪个对象的别名。在函数调用是,实参对象名传给形参对象名,形参对象名就成为实参对象名的别名。实参对象和形参对象代表同一个对象,所以改变形参对象的值就是改变实参对象的值。

实际上,在虚实结合时是把实参对象的地址传给形参对象,使形参对象的地址取实参对象的地址,从而使形参对象和实参对象共享同一个单元。这就是地址传递方式。

通过使用引用参数,一个函数可以修改另外一个函数内的变量。因为引用对象不是一个独立的对象,不单独占用内存单元,而对象指针要另外开辟内存单元(其内容是地址),所以传引用比传指针更好。

注意:虽然系统向形参传递的是实参的地址而不是实参的值,但实参必须使用对象名。

3.14 默认参数

默认参数就是不要求程序员设定该参数,而由编译器在需要时给该参数赋默认值。当程序员需要传递特殊值时,必须显式地指明。默认参数是在函数原型中说明的,默认参数可以多于1个,但必须放在参数序列的后部。

如果一个默认参数需要指明一个特定值,则在其之前所有的参数都必须赋值。

3.1.5 使用const保护数据

const修饰传递参数,意思是通知函数,它只能使用参数而无权修改它。这主要是为了提高系统的自身安全。C++中普遍采用这种方法。

3.2 深入讨论函数返回值

C++函数的返回值类型可以是除数组以外的任何类型。非void类型的函数必须向调用者返回一个值。数组只能返回地址。当函数返回值是指针或引用对象时,需要特别注意:函数返回所指的对象必须继续存在,因此不能将函数内部的局部对象作为函数的返回值。

3.2.1 返回引用的函数

函数可以返回一个引用,将函数说明为返回一个引用的主要目的是为了将该函数用在赋值运算符的左边。函数原型的表示方法如下:

数据类型 &函数名(参数列表);

3.2.2 返回指针的函数

函数的返回值可以是存储某种类型数据的内存地址,称这种函数为指针函数。它们的一般定义形式如下:

类型标识符 *函数名(参数列表);

C++中,除了内存分配失败之外,new不会返回空指针,并且没有任何对象的地址为零。指针所指向的对象的生存期不应低于该指针的生存期。

3.2.3 返回对象的函数

3.2.4 函数返回值作为函数的参数

如果用函数返回值作为另一个函数的参数,这个返回值必须与参数类型一致。

3.3 内联函数

使用关键字inline说明的函数称内联函数。在C++中,除具有循环语句、switch语句的函数不能说明为内联函数外,其他函数都可以说明为内联函数。使用内联函数能加快程序执行速度,但如果函数体语句多,则会增加程序代码的大小。使用小的内联函数在代码速度和大小上可以取得折衷,其他情况下取决于程序员是追求代码速度,还是追求代码的规模。

由于编译器必须知道内联函数的函数体,才能进行内联替换,因此,内联函数必须在程序中第一次调用此函数的语句出现之前定义。

3.4 函数重载和默认参数

函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性。

C++的多态性又被直观地称为“一个名字,多个函数”。源代码只指明函数调用,而不说明具体调用哪个函数。编译器的这种连接方式称为动态联编或迟后联编。在动态联编中,直到程序运行才能确定调用哪个函数(动态联编需要虚函数的支持)。如果编译器在编译时,能根据源代码调用固定的函数标识符,并用物理地址代替它们,这就称为静态联编或先期联编。静态联编是在程序被编译时进行的。

使用默认参数,就不能对少于参数个数的函数进行重载。另外,仅有函数返回值不同也是区分不了重载函数的。当使用默认参数设计类的构造函数时,要特别注意这一问题。

3.5 函数模板

1.引入函数模版

由于函数在设计时没有使用实际的类型,而是使用虚拟的类型参数,故其灵活性得到加强。当用实际的类型来实例化这种函数时,就好像按照模版来制造新的函数一样,所以称这种函数为函数模板。将函数模版与某个具体数据类型连用,就产生了模板函数,又称这个过程为函数模板实例化,这种形式就是类型参数化。

2.函数模板的参数

对于一个默认调用,能从函数的参数推断出模板参数的能力是其中最关键的一环。要想省去显式调用的麻烦,条件是由这个调用的函数参数表能够惟一地标识出模板参数的一个集合。

3.使用显式规则和关键字typename

C++专门定义一个仅仅用在模板中的关键字typename,它的用途之一是代替template参数列表中的关键字class

第三章 函数和函数模板

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
模板一般分为模板函数和类模板。 模板函数的一般形式为: template<类型形参表> 返回值类型
模板一般分为模板函数和类模板。 模板函数的一般形式为: template<类型形参表> 返回值类型
模板一般分为模板函数和类模板。 模板函数的一般形式为: template<类型形参表> 返回值类型
当模板函数遇上数组参数 在伯乐在线上看到一篇关于数组和指针的文章(文章链接:http://blog.jobbol
#include<iostream> using namespace std; const double PI = 3.1415926; template <class
说明 由于课程设计需要,特编写本程序。本程序首先定义了一个冒泡程序的模板函数,然后在main()函数
一般情况下,最好不在模板中使用php函数,但有时没有其他更好的办法,但是smarty自带的变量调节函数
先上模板方法模式的类图: 代码演示: public abstract class AbstractClass { public abstract void
Summary:你有一些子类,其中相应的某些函数以相同顺序执行类似的操作,但各个操作的细节上有所不同
C++模板的学习会遇到各种各样的问题,对于一个某种程度上的新手而言,难免会碰到一些问题。但C++模
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号