OOP_由C到C++ (5)

而C++中采用了函数重载后,对于具有同一功能的函数,如果只是由于函数参数类型不一样,则可以定义相同名称的函数

(3) 匹配重载函数的顺序

由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。

具体来说,按以下三个步骤的先后次序找到并调用那个函数:

(1)寻找一个严格的匹配,即:调用与实参的数据类型、个数完全相同的那个函数。

(2)通过内部转换寻求一个匹配,即:通过(1)的方法没有找到相匹配的函数时,则由C++系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。

(3)通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由程序员对实参进行强制类型转换,以此作为查找相匹配的函数的依据。

例1.8 重载例子 #include <iostream.h> void print(double d) { cout<<"this is a double "<<d<<"\n"; } void print(int i) { cout<<"this is an integer "<<i<<"\n"; } void main() { int x=1,z=10; float y=1.0; char c='a'; print(x); //按规则(1)自动匹配函数void print(int i) print(y); //按规则(2)通过内部转换匹配函数 void print(double i) //因为系统能自动将float型转换成double型 print(c); //按规则(2)通过内部转换匹配函数 void print(int i) //因为系统能自动将char型转换成int型 print(double(z)); //按规则(3)匹配void print(double i) //因为程序中将实参z强制转换为double型。 } 例 重载例子

编写一个程序,用来求两个整数或3个整数中的最大数。如果输入两个整数,程序就输出这两个整数中的最大数,如果输入3个整数,程序就输出这3个整数中的最大数。

#include <iostream> using namespace std; int main( ) { int max(int a,int b,int c); //函数声明 int max(int a,int b); //函数声明 int a=8, b=-12, c=27; cout<<"max(a,b,c)="<<max(a,b,c)<<endl; //3个整数中的最大者 cout<<"max(a,b)="<<max(a,b)<<endl; //2个整数中的最大者 } int max(int a,int b,int c) { if(b>a) a=b; if(c>a) a=c; return a; } int max(int a,int b) { if(a>b) return a; else return b; } (4) 定义重载函数时的注意事项

重载函数间不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。
如:

void myfun(int i) {………………} int myfun(int i) {………………} // 这种重载是错误的

应使所有的重载函数的功能相同。如果让重载函数完成不同的功能,会破坏程序的可读性。

(5) 函数模板

1) 函数模板 (function template)

建立一个通用函数,其函数类型和形参类型不具体指定,而是一个虚拟类型。

2) 应用情况

凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。

3) 一般形式:
- template < typename T> // 模板头 通用函数定义
- template <class T> // 模板头 通用函数定义
- template <class T1,typename T2> // 多个参数 通用函数定义

说明: class与typename可以通用

#include <iostream> using namespace std; template<typename T> // 模板声明,其中T为类型参数 T max(T a, T b) // 定义一个通用函数, T作为虚拟的类型名 { if(b>a) return b; else return a; } //template <typename T> T max(T a, T b) //{ //… //} int main( ) { int i1=111, i2=222, i; double d1=12.34, d2=56.78,d; i=max(i1,i2); // 调用模板函数,此时T被 int 取代 d=max(d1,d2,d3); // 调用模板函数,此时T被 double 取代 cout<<"i_max=" << i <<endl; cout<<"f_max=" <<f<<endl; return 0; } 函数模板说明:

1) 在对程序进行编译时,遇到第13行调用函数max(i1,i2), 编译系统会将函数名max与模板max相匹配,将实参的类型取代了函数模板中的虚拟类型T。此时相当于已定义了一个函数,然后调用它。

int max(int a,int b) { if(b>a) a=b; if(c>a) a=c; return a; }

2) 与重载函数比较:用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于:函数的参数个数相同而类型不同,且函数体相同的情况。如果参数的个数不同,则不能用函数模板;
3) main函数不能定义为模板函数。

11. 作用域标示符::

通常情况下,如果有两个同名变量,一个是全局的,另一个是局部的,那么局部变量在其作用域内具有较高的优先权。

下面的例子说明了这个问题。

#include "iostream.h" int avar=10; main( ) { int avar; avar=25; cout<<"avar is"<<avar<<endl; return 0; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzsgy.html