C或C++中重载的一些注意之处

来源:互联网 发布:oracle数据库管理软件 编辑:程序博客网 时间:2024/05/07 04:43

    重载,就是一个函数,输入不同类型数据,有不同结果。举个例子:

void add();

int add(int);

void add(short);

void add(int, char);

    以上为重载的定义。输入不同类型的实参,调用不同的结果。如 add(4)。

    实参是由编译程序辨别。也就是说,有如下规律:

  *首先精确匹配。也就是,如果输入的是add(4),那么调用的一定是add(int)。

  *通过类型提升。如果我调用add('a'),是个char型。char可提升为int,优于short。因此add('a')会调用add(int)。

  *通过标准转换。这里有问题了,一般情况都是类型提升(也就是转换为更优的类型)。但是有的情况,并不可行。如我定义add(long)和add(short),输入的是add(3.14)。这里3.14是个double型,转换成long或者是short并没有什么优劣,这里就会出问题。因此调用的时候需要强制类型转换。还有一种情况:void add(int,int)和void add(double,double),调用的时候是add(3,3.14)或者add(3.14,3)。这时候,是调用哪个呢?3匹配int,3.14匹配double。编译器也不知道该调用哪个。规则里对于这个并没有优先级。因此强制类型转换才行。

  *通过类类型转换。这个就不用赘述了。

    下面再说说重载的声明和使用。

*首先,返回值并不重载。试想一下,你调用的时候,机器并不能预先知道你返回的是啥,你调用的时候也没说啊。声明的时候有void或者int的返回值,调用的时候什么都没有啊。也就是说,void add()和int add()并不是重载。编译不通过的。

*其次,一定要不同数量,或者不同类型的形参才能重载。这是重载的基本定义。否则就是重复声明。以下几种情况是错误的。

    比如说,void add(char a, int b)和void add(char a, int b=1)。貌似添加了默认实参,有些不同,但其实编译会遇到重复声明的错误。也就是说,第二条(不分先后,只是代码上的,如果有默认的在前,那无默认的是错的,如果无默认的在前,那么有默认的是错的)语句会错误,编译不通过。

    再比如说,typedef的两个类名,其实是同一个类,这也是重复声明。或者在某个形参前面添加const,这也是重复声明。再或者,仅仅是形参的名字不同,比如add(char a),add(char b)这也是重复声明。

*关于使用方面。在上面,我们看到有默认实参的情况。这里有一种情况:void add(char a, int b = 1)和void add(char a)。这个声明是可以通过的。因为有不同数量的形参。可是调用的时候,如果是add('a',1)就会调用第一个。但如果,你调用的时候,输入add('a')。这情况怎么办?调用的是哪个?经过测试,这种情况,编译器也不知道该调用哪个,因此会提示你出错,告诉你有两个匹配的函数。

*重载不能滥用。很多情况,使用不同的函数名会更好。比如addInt,addChar之类的,清晰可见。一般重载的使用,都是比较简单的调用的情况,比如toString(String),toString(int)之类的。

*重载有作用域的限制。在更局部的地方,不管是使用了相同名字的变量还是函数,都会屏蔽上一层的定义。比如:

void add();

void add(char);

void add(double);

{

  int add = 0;

  string a = add(); //这里就会出错,因为上面的add变量把前面的函数覆盖了

}

{

  void add(int);

  add(1); //正确的,因为上面声明了

  add('a'); //错误的,外面定义的被隐藏了

  add(3.14); //这里会调用add(int)

}


关于重载,目前就这么多内容。以后想到了再加吧