第三部分思维导图PDF下载C++程序设计 第三章 函数和函数模板
![]()
3.1 函数的参数及其传递方式
- 3.1.1 对象作为函数参数
- 传值和传引用,传引用其实就是传对象的地址,所以也称传地址方式(对象的首地址)。
- 传递对象地址值是使用对象指针作为参数
- 传递对象地址是使用对象引用作为参数。
- 当在函数中改变形参的值时,改变的是这个备份中的值,不会影响渊来实参的值。
- 不能将数组的值作为函数传递,但可以将数组的地址作为参数,即使用指针作为参数。
- 传值和传引用,传引用其实就是传对象的地址,所以也称传地址方式(对象的首地址)。
-
3.1.2 对象指针作为函数传递
- 数组名就是数组的指针名,数组指针名指向数组首地址,所以数组能用传数组的地址值的方式。
- 对象指针作为函数传递,实参与形参的地址相同,所以改变形参就是改变实参。
- 实参使用取地址符
- swap(&str1, &str2);
- 3.1.3 引用作为函数参数
- 实参对象和形参对象代表同一个对象,所以改变形参对象的值就是改变实参对象的值,即传地址方式。
- 在说明所引用参数时,不需要提供初始值,其初始值在函数调用是由实参对象提供。
- 注意,虽然系统向形参传递的是实参的地址而不是实参的值,但实参必须使用对象名,如
- swap(str1, str2);正确!
- swap(&str1, &str2);错误!
- 3.1.4 默认参数
- 由编译器在需要时给该值参数默认赋值,默认参数是在函数原型中说明,即在声明处说明。
- 如果一个默认参数需要指明一个特定值,则在其之前的所有参数都必须赋值。
- 3.1.5 使用const 保护参数
- 用const 修饰传递参数,意思是通知函数,它只能使用参数而无权修改它。
3.2 深入讨论函数返回值
3.2.1 返回引用的函数
- C++函数的返回值类型可以是除数组和函数以外的任何类型。
- 函数返回所指的对象必须持续存在,不能将函数内部的局部对象作为函数的返回值!
- 函数可以返回一个引用,将该函数说明为返回一个引用的主要目的使为了将该函数用在赋值运算符的左边。
- 函数原型
- 数据类型 & 函数名 (参数列表) 如:
- 声明:int& index(int i);
- 定义:int& index(int i)
- 返回:{ return a[i] }
- 数据类型 & 函数名 (参数列表) 如:
- 函数原型
3.2.2 返回指针的函数
- 函数的返回值可以是存储某种类型数据的内存地址(例如变量的地址、数组的首地址以及指针变量的地址),这种函数为指针函数。
- 函数原型
- 类型标识符 *函数名(参数列表) 如
- 声明:float *input(int&);
- 定义:float *input(int&)
- 返回:return buf;
- 类型标识符 *函数名(参数列表) 如
- 函数原型
3.2.3 返回对象的函数
- 略
- tips: cin 一次只录入遇到的第一个空格处,但如果第一个为空格,即遇到字符前,会跳过空过。
3.2.4 函数返回值作为函数的参数
- 如果用函数返回值作为另一个函数的参数,这个返回值必须与参数的类型一致。
3.3 内联函数
在函数定义时,使用关键字inline说明的函数称为内联函数,在C++中,除具有循环语句、switch语句的函数不能说明为内联函数外,其他函数都可以说明为内联函数。如:
- inline int isnumber(char c) {return (c >= ‘0’ && c <= '9')? 1 : 0; }
Tips: 内联函数只是一种对编译器的请求,但编译器完全由可能拒绝或忽视该请求。
内联函数可能加快程序执行速度,但过多则会增加程序代码的大小。
由于编译器必须知道内联函数的函数体,才能进行内联替换,因此,内联函数必须在程序中第一次调用此函数的语句出现之前定义!TIPS:简单理解即在声明处定义。
3.4 函数重载和默认函数
函数重载可使一个函数名具有多种功能,即具有”多种形态“,称这种特性为多态性。如:
- 定义:int max(int, int, int)和 double max(double, double, double)
- 调用:max(1, 2)或max(2.1, 2.2)
C++的多态性又被直观的称为”一个名字,多个函数“。源代码只指明函数调用,而不说明具体调用哪个函数,编译器的这种连接方式称为动态联编或迟后联编。相对的编译器在编译时,能根据源代码调用固定的函数标识符,并用物理地址代替它们,则称为静态联编。静态联编是在程序编译时进行的。
Tips
- 1、函数的形参必须不同,或个数不同或类型不同,不能只依靠返回值类型不同或形参变量名不同来实现函数重载。
- 2、不要将不同功能的函数定义为重载,以免出现对调用结果的误解。
3.5 函数模板
1、引入函数模板
- 函数原型
- template < class T> T max(T m1, T m2) { return (m1 > m2) ? m1 : m2 }
- 编译实现如:int max(int m1, int m2) { return(m1 > m2)? m1 : m2 }
- template < class T> T max(T m1, T m2) { return (m1 > m2) ? m1 : m2 }
- class意为”用户定义的或固有的类型“
- 当用实际的类型来实例化这种函数时,就好像按照模板来制造新的函数一样,所以称这种函数为函数模板,将函数模板与某个具体数据类型连用,就产生了模板函数,又称这个过程为函数模板实例化,这种形式就是类型参数化。
- 一般选用T 作为标识符来表示类型参数,即参数名是可以任意挑选的。但规定以template关键字和一个形参表开头。
2、函数模板的参数
-
显式比较准则
- 函数模板名 <模板参数> (参数列表)
- 如 cout << max
(2, 5) << endl;
- 如 cout << max
- 函数模板名 <模板参数> (参数列表)
- 默认方式
- 函数模板名(参数列表)
3、使用显式规则和关键字typename
- C++专门定义了一个仅仅用在模板中的关键字typename,它的用途之一是代替template参数列表中的关键字class
- 即 template
可写为 template
留言