第3章 函数和函数模板
3.1 函数的参数及其传递方式
C语言函数参数的传递方式只有传值一种,传值又分为传变量值和传变量地址值两种情况。比较复杂的是结构变量,结构变量的值是指结构域中所有的变量值。在C++中,像int、float、double、char、bool等简单数据类型的变量,也是对象。类对象一般都包括数据成员和成员函数,如果在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。
分享到:
相关推荐
C++中的函数模板和类模板是泛型编程的重要组成部分,它们允许我们编写更为通用的代码,从而能够处理不同数据类型的对象。在这个实验报告中,我们将深入理解这些概念,并通过具体的编程实践来掌握它们。 首先,我们...
本示例提供了一个名为`Max`的函数模板和一个非模板函数`Max`的实现。首先来看函数模板的定义: ```cpp template T Max(T ary[], int size = 10) { cout ģTMax(T ary[], int size = 10)ãTûΪ" (T).name() ͡" ; ...
第三章的内容主要涵盖以下几个方面: 1. **函数的定义和使用**: - 函数定义的语法结构包括返回类型、函数名和参数列表。例如,`int totalbetween(int a, int b)` 定义了一个名为`totalbetween`的函数,它接受两个...
【第3章 函数】 在C++编程语言中,函数是一种组织代码的机制,它封装了一段可重复使用的代码块,执行特定的任务。函数能够提高代码的可读性,降低复杂性,使得程序设计更加模块化。本章将深入探讨C++中的函数,包括...
第一种是传统的使用临时变量的方法,第二种利用了加减运算,第三种则使用了位运算(异或)。这三种方法各有优劣,其中位运算的方法最为巧妙,无需额外的存储空间。 4. **素数判断函数** - `isPrime`函数用于判断...
### MATLAB S-函数标准模板详解 #### 概述 MATLAB 的 M 文件 S 函数(System Function)是一种高级编程接口,允许用户自定义模块的行为,从而实现更复杂、更精细的控制逻辑。S 函数可以处理连续系统、离散系统或...
在“c++函数模板求极值得操作 vs2008 简单的函数模板操作”这个主题中,我们可以想象一个函数模板,用于找出一组数值中的最大值和最小值。首先,我们需要一个模板声明,如下: ```cpp template std::pair, T> ...
本章“第三章 初步了解函数”将引导我们踏入C++函数的世界,深入理解其核心概念和使用方法。 函数在C++编程中扮演着至关重要的角色,它们是代码组织的基本单元,可以执行特定任务并可能接收输入参数,返回结果。...
### C++第8章函数探幽 #### 一、内联函数 内联函数是C++为提升程序执行效率而引入的一个重要特性。通常情况下,当一个函数被调用时,程序会经历以下步骤: 1. **存储当前指令的位置**:在函数调用之后立即保存...
【母函数模板】是一种在数学和计算机科学中用于解决组合计数问题的工具,尤其在处理有限数量的对象的排列组合时。母函数的概念源于幂级数,它将组合问题的加法规则与幂级数的乘幂对应起来,从而简化计算。 在第一个...
C++ Primer第五版第六章深入探讨了函数的各个方面,包括定义、调用、参数传递、返回值以及函数模板等核心概念。本章节的练习解答旨在帮助读者巩固这些知识,并通过实践提升对C++函数的理解。 1. **函数定义与声明**...
本章主要围绕函数的几个核心概念展开,包括函数的概念、定义、调用、参数传递以及变量的作用域。 1. **函数的概念** - **主函数与程序执行**:C程序的执行始于`main`函数,这是程序的入口点。`main`函数调用其他...
C++中的函数模板是编程中一个非常重要的概念,它允许我们编写通用的代码,能够处理多种数据类型。函数模板提供了一种方式来定义一个函数,该函数可以...正确理解和使用函数模板是成为一名熟练的C++程序员的必要条件。
4.6 函数模板:函数模板是一种泛型编程技术,允许创建通用函数,适用于多种数据类型。通过模板,我们可以编写一次函数,然后在需要时为不同数据类型实例化。 4.7 作用域与存储类:作用域决定了变量的可见范围,存储...
在提供的两个作业文件中,“第8章第二次作业--模板函数与模板类作业与习题参考答案.cpp”和“第8章第一次作业--模板函数与模板类作业与习题参考答案.cpp”,可能包含了更多关于模板函数和模板类的应用和练习,包括...
第三章 函数和函数模板 3.1 函数的参数及其传递方式 函数可以接受零个或多个参数,参数可以按值传递(复制数据),按引用传递(传递内存地址)或按常量引用传递(防止在函数内部修改参数)。 3.2 深入讨论函数...
实验6的第6题要求设计3个函数:输入10个整数、交换最小值和第一个数、交换最大值和最后一个数。这展示了如何通过函数组合完成更复杂的任务。 通过这些实验,初学者可以逐步掌握C语言函数的使用,包括函数定义、...
根据给定的文件信息,我们可以总结出以下几个C++知识点: ### 一、函数模板(Function Templates) ...这些示例不仅展示了函数模板的基本用法,还介绍了如何利用模板来简化复杂的数学计算和逻辑判断过程。
第3章隐藏实现 第4章初始化与清除 第5章函数重载与缺省参数 第6章输入输出流介绍 第7章常量 第8章内联函数 第9章命名控制 第10章引用和拷贝构造函数 第11章运算符重载 第12章动态对象创建 第13章继承和组合 第14章...
3. **错误处理与调试函数**:如ErrorText、GetLastError、IsError等,这些函数在程序出错时提供信息,帮助开发者定位和修复问题。 4. **数据库操作函数**:PB支持SQL语句,但还提供了诸如ExecuteSQL、FetchRow等...