9.1画齦重载 ●●●●● ●●●● ●●0 例:用重载函数实现求圆和矩形的周长。 ●●● ●●●● #include <iostream h> void maino//9-1-2. cpp const double pi-31415. float a, b,r, double length(float r) cout<<输入圆半径:”; i return 2*PI*r cin>> r cout<“圆周长:”<< length(r) loubie lens ngth(float x, float yendl i return 2*(x+y) cou<<“输入矩形长和宽:”; cIn cout<<“矩形周长:” < length(a, b)<<endl <心画
9.1 函数重载 #include <iostream.h> const double PI=3.1415; double length(float r) { return 2*PI*r; } double length(float x,float y) { return 2*(x+y); } 例:用重载函数实现求圆和矩形的周长。 void main() // 9-1-2.cpp { float a,b,r; cout << “输入圆半径:” ; cin >> r; cout << “圆周长:” <<length(r) <<endl; cout << “输入矩形长和宽:” ; cin >> a >> b; cout << “矩形周长:” << length(a, b) <<endl; }
91画数重载 ●●●●● 函数重载的表示形式 ●●●● ●●0 普通成员函数重载可表达为两种形式: ●●● ●●●● 1.在一个类说明中重载 例如: Show( int, char )i Show( char float)i 2.基类的成员函数在派生类重载。有3种编译区分方法 (1)根据参数的特征加以区分 例如: show〔int,char)与 Show( char * float) 不是同一函数,编译能够区分 (2)使用“:"加以区分 例如:A:Show()有别于B:Show() (3)根据类对象加以区分 例如: Aobj Show()调用A:Show( Bobj show()调用B:Show()
9.1 函数重载 函数重载的表示形式 普通成员函数重载可表达为两种形式: 1. 在一个类说明中重载 例如: Show ( int , char ) ; Show ( char * , float ) ; 2. 基类的成员函数在派生类重载。有3种编译区分方法 (1)根据参数的特征加以区分 例如: Show ( int , char ) 与 Show ( char * , float ) 不是同一函数,编译能够区分 (2)使用“ :: ”加以区分 例如: A :: Show ( ) 有别于 B :: Show ( ) (3)根据类对象加以区分 例如: Aobj.Show ( ) 调用 A :: Show ( ) Bobj.Show ( ) 调用 B :: Show ( )
9.1画数重载 ●●●●● 函数重载的注意事项 ●●●● ●●0 在C++语言中,编译程序选择相应的重载函数版本时 函数返回值类型是不起作用的。不能仅靠函数的返回值来 区别重载函数,必须从形式参数上区别开来。例如: void print(int ai void print(int a, int b)i int print(float a Di 这三个函数是重载函数,因为C++编译程序可以从形 式参数上将它们区别开来。 但: int f(int a) double f(int a) 这两个函数就不是重载函数,编译程序认为这是对一个 函数的重复说明,因为两个函数的形式参数个数与相应位 置的类型完全相同。 <心画
9.1 函数重载 函数重载的注意事项 在C++语言中,编译程序选择相应的重载函数版本时 函数返回值类型是不起作用的。不能仅靠函数的返回值来 区别重载函数,必须从形式参数上区别开来。例如: void print(int a); void print(int a,int b); int print(float a[]); 这三个函数是重载函数,因为C++编译程序可以从形 式参数上将它们区别开来。 但: int f(int a); double f(int a); 这两个函数就不是重载函数,编译程序认为这是对一个 函数的重复说明,因为两个函数的形式参数个数与相应位 置的类型完全相同
91画数重载 ●●●●● 同样道理,不同参数传递方式也无法区别重载函数,延 void func(int value)i ●●●● void func(int &value); 也不能作为重载函数 在程序中不可滥用函数重载,不适当的重载会降低程序 的可读性。C++语言并没有提供任何约束限制重载函数之 间必须有关联,程序员可能用相同的名字定义两个互不相关 的函数。实际上函数重载暗示了一种关联,不应该重载那些 本质上有区别的函数,只有当函数实现的语义非常相近时才 应使用函数重载 函数重载的二义性 函数重载的二义性( ambiguity)是指C++语言的编 译程序无法在多个重载函数中选择正确的函数进行调用。函 数重载的二义性主要源于C++语言的隐式类型转换与默认 参数
9.1 函数重载 同样道理,不同参数传递方式也无法区别重载函数,如: void func(int value); void func(int &value); 也不能作为重载函数。 在程序中不可滥用函数重载,不适当的重载会降低程序 的可读性。C++语言并没有提供任何约束限制重载函数之 间必须有关联,程序员可能用相同的名字定义两个互不相关 的函数。实际上函数重载暗示了一种关联,不应该重载那些 本质上有区别的函数,只有当函数实现的语义非常相近时才 应使用函数重载。 函数重载的二义性 函数重载的二义性(ambiguity)是指C++语言的编 译程序无法在多个重载函数中选择正确的函数进行调用。函 数重载的二义性主要源于C++语言的隐式类型转换与默认 参数
91画数重载 ●●●●● 在函数调用时,编译程序将按以下规则选择重载函数。 如果函数调用的实际参数类型与一个重载函数形式参数类型 完全匹配,则选择调用该重载函数;如果找不到与实陈参数 类型完全匹配的函数原型,但如果将一个类型转换为更高级 类型后能找到完全匹配的函数原型,编译程序将选择调用该 重载函数。所谓更高级类型是指能处理的值域较大,如int转 换为 unsigned int, unsigned int转换为long,long转换为 unsigned float等。 例如: int func(double d count<<funcA) 虽未声明函数原型 int func(char),但函数调用func (“A)并不会产生任何问题,因为编译程序自动将字符‘A 转换为 double类型,然后调用函数 rint fund( double)。 隐式类型转换是由C+十编译程序自动完成的,这种类型 转换是引起函数重载二义性的主要原因。 <心画
9.1 函数重载 在函数调用时,编译程序将按以下规则选择重载函数: 如果函数调用的实际参数类型与一个重载函数形式参数类型 完全匹配,则选择调用该重载函数;如果找不到与实际参数 类型完全匹配的函数原型,但如果将一个类型转换为更高级 类型后能找到完全匹配的函数原型,编译程序将选择调用该 重载函数。所谓更高级类型是指能处理的值域较大,如int转 换为unsigned int,unsigned int转换为long,long转换为 unsigned float等。 例如:int func(double d); … count<<func(‘A’); 虽未声明函数原型int func(char),但函数调用func (‘A’)并不会产生任何问题,因为编译程序自动将字符‘A’ 转换为double类型,然后调用函数int func(double)。 隐式类型转换是由C++编译程序自动完成的,这种类型 转换是引起函数重载二义性的主要原因