面向对象程序设计2——参数数量/类型不同的函数&函数多态

参数数量/类型不同的函数

  • 编写求最大值的函数
    1.C++和Java都允许在相同的有效范围相同的区域内出现同名函数
    C++指各个全局函数,Java指同一个框架内
    重载函数-overloaded function
    2.编译时,根据调用命令中的实际参数选择相匹配的版本作为被调函数
    不允许函数形参列表完全相同而函数返回值类型不同的同名函数
    (形参的数量、类型、次序相同,不含形参名称)
    3.如果出现多个函数匹配版本,则编译报错
    ambiguus call overloaded function
//同名函数的调用
#include
using namespace std;//“std”命名空间,主函数前说明,后可直接使用cin,cout
                    //也可在每次使用时对cout 说明,std::cout<<”Hello World”;

double max(double a,double b,double c=-1E308) //三个实数
                   //C++允许定义函数时为形参设定默认值,也称缺省值
{
     
	double x;
	x = a;
	if(x<b) x = b;
	if(x<c) x = c;
	return x;
}
double max(double a,double b)  //两个实数
{
     
	return a > b ? a : b;
}
double max(double x[],int n) //实形数组,定义数组,排序。 n数组中元素的个数
									//输出数组中的最大数																
{
     
	double t = x[0];
	for(int i=1;i<n;i++)
		if(t<x[i]) t=x[i];
	return t;
}
	
int main()
{
     
	cout<<max(3.5,4.7)<<endl;
	cout<<max(3.5,4.7,4.2)<<endl;
	
	double buf[10]={
     1.2,3.4,5.6,7.8,9.0};
	cout<<max(buf,10)<<endl;
	system("pause");  //调用系统命令,暂停终端
}
  • 函数模板
    1.Java语言不支持函数模板
    2.函数模板表示一组同名函数,除了其中特定标识符代表的类型不同之外,函数的其余部分都相同。
    3.当编译器发现有针对模板的函数调用时,则新生成一个对应版本的函数。已生成的模板函数遇见相同模板的调用时不再生成新的函数。
    编译器并不把函数模板编译成机器语言,而是在检查到程序中有针对模板的函数调用时才生成实参相对应的函数,并将该函数编译成相应的机器语言代码。
//使用函数模板生成模板函数——求最大值函数
#include
using namespace std;

template<class S,class T>   //"T"变元 
T max(S a,T b)
{
     
	return a>b?a:b;
}
/*
double* max(double* a,double* b)
{
	return a>b?a:b;
}
*/
int main()
{
     
	int x=3,y=5;
	double a=4.15,b=9.27;
	int z = max(x,y);
	double c = max(a,b);
	double *t = max(&a,&b);  //比较a与b的地址值的大小
	
	printf("%d\n%lf\n%lf\n",z,c,*t); 
}
  • 参数数量不定的情况
    C++定义形参数量不限
void fun(char *fs,...)//第一参数是字符串,是指向字符的指针,是起始地址
{
     
	//具体代码
}

Java定义形参数量不限

static void show(Object...arg)    //object是Java的基类,arg为形参名,...表示数量不限
{
     
	//具体代码
}

Java取数组长度 arg.length
int i=0,i

  • 输出数组的函数
#include
using namespace std;

int main()
{
     
	int x[]={
     1,5,7,9,8,4};
	double y[]={
     1.2,5.6,8.9};
	char s[]="Hello World!";
	
	cout<<x<<endl;
	cout<<y<<endl;
	cout<<s<<endl;
}

面向对象程序设计2——参数数量/类型不同的函数&函数多态_第1张图片
系统不支持该种输出方法

  • 设计输出数组的函数模板
#include
using namespace std;

template <typename T> //typename 可写为 class
void Show(T *x,int n)
{
     
	for(int i=0;i<n;i++)
		cout<<x[i]<<' ';
	cout<<endl;
}
 
int main()
{
     
	int x[]={
     1,5,7,9,8,4};
	double y[]={
     1.2,5.6,8.9};
	char s[]="Hello World!";
	
	Show(x,6);
	Show(y,3);
	Show(s,sizeof(s));   //sizeof()测量字符串的长度 

}
//指针版本
template<class T>
void Show(T *a,T *b)
{
     
	while(a!=b)
		cout<<*a++<<' ';
	cout<<endl;
}
//以调用数组x为例
Show(x,x+6)//想要显示最后一个数组的下一个位置的地址

面向对象程序设计2——参数数量/类型不同的函数&函数多态_第2张图片

  • 函数多态
    把同一种操作作用于各种可能的对象,产生相同或者相似的效果,称为多态(Polymorphism)。多态是面向对象程序设计的三大核心理念之一(另两个是封装和继承)。
    用一组同名函数达到多态的效果称为函数多态。

    比如设计一组同名函数max,功能是求若干数据的最大值。“可能的对象”可以是整数、可以是实数,也可以是其它类型的数据;可能是3个数找大,可能是5个数找大,也可能是100个数找大。数据类型、数量不同,但想做的事情都是一样的:找最大值。

你可能感兴趣的:(面向对象程序设计,c++)