kwseeker

学编程:找代码,读代码,改代码,写代码;少看书。但少看不是不看,看一本书要限制在一天内。任务是通读书中主要的概念,明白大致是干什么用的,形成一个大概的框架;然后一周内干掉书中全部代码,代码不理解再浏览书中相关章节,注意是浏览。或者刷博客。代码实在刷不懂,可以先刷后面,待日后重新刷;因为书中代码有些部分可能出自后面的章节。代码总是在多次刷过之后,拨开乌云见日月的。。。

导航

C++@重载函数

关于重载详细分析参考:

http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html

内部机制涉及重载函数如何解决命名冲突,调用匹配的问题。

 

分辨重载的准则:

  • 精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针、T到const T;
  • 提升匹配:即整数提升(如bool 到 int、char到int、short 到int),float到double
  • 使用标准转换匹配:如int 到double、double到int、double到long double、Derived*到Base*、T*到void*、int到unsigned int;
  • 使用用户自定义匹配
  • 使用省略号匹配:类似printf中省略号参数

如果在最高层有多个匹配函数找到,调用将被拒绝(因为有歧义、模凌两可)。看下面的例子:

void print(int);
void print(const char*);
void print(double);
void print(long);
void print(char);

void h(char c,int i,short s, float f)
{
     print(c);//精确匹配,调用print(char)
     print(i);//精确匹配,调用print(int)
     print(s);//整数提升,调用print(int)
     print(f);//float到double的提升,调用print(double)

     print('a');//精确匹配,调用print(char)
     print(49);//精确匹配,调用print(int)
     print(0);//精确匹配,调用print(int)
     print("a");//精确匹配,调用print(const char*)
}

定义太少或太多的重载函数,都有可能导致模凌两可,看下面的一个例子:

void f1(char);
void f1(long);

void f2(char*);
void f2(int*);

void k(int i)
{
       f1(i);//调用f1(char)? f1(long)?
       f2(0);//调用f2(char*)?f2(int*)?
}

这时侯编译器就会报错,将错误抛给用户自己来处理:通过显示类型转换来调用等等(如f2(static_cast<int *>(0),当然这样做很丑,而且你想调用别的方法时有用做转换)。上面的例子只是一个参数的情况,下面我们再来看一个两个参数的情况:

int pow(int ,int);
double pow(double,double);

void g()
{
       double d=pow(2.0,2)//调用pow(int(2.0),2)? pow(2.0,double(2))?
}

 

/*
 *重载:两个或者多个函数有同一个函数名,不同数量的参数。
 *当参数个数相同,参数类型不同,重载时会首先调用类型参数的函数,
 *如果没有,则进行类型强制转换。
 */
#include <iostream>
using namespace std;

int ave(int n1, int n2);
double ave(double n1, double n2);
double ave(double n1, double n2, double n3);

int main()
{
	cout << "The average of 2.0 2.5 3.0 is: "
		 << ave(2.0, 2.5, 3.0) <<endl;
	cout << "The average of 4.5 5.5 is:"
		 << ave(4.5, 5.5) << endl;
	cout << "The average of 5 8 is:"
		 << ave(8, 5) << endl;
	return 0;
}

int ave(int n1, int n2)
{
	return (n1-n2);
}

double ave(double n1, double n2)
{
	return ((n1+n2)/2.0);
}

double ave(double n1, double n2, double n3){
	return ((n1+n2+n3)/3.0);
}
运行结果:
The average of 2.0 2.5 3.0 is: 2.5 The average of 4.5 5.5 is:5 The average of 5 8 is:3

  

posted on 2015-05-30 19:32  kwseeker  阅读(258)  评论(0编辑  收藏  举报