函数的重载(C++学习笔记 9)

C语言不允许重载
  在传统C语言中,函数名必须是唯一的,也就是说不允许出现同名的函数,
  例如,当要求编写求整数、长整型数和双精度数的二次方的函数时,若用C来处理,必须编写3个函数,这3个函数的函数名不允许同名。例如:
  Isquare( int i );   //求整数的二次方
  Lsquare( long l );  //求长整型数的二次方
  Dsquare( double d );  //求双精度数的二次方

C++中函数的重载
  在C++中,函数可以重载。即这意味着,只要函数参数的类型不同,或者参数的个数不同,或者两者都有。当两个或者两个以上的函数共用一个函数名时,称为函数的重载。 被重载的函数称为重载函数。
重载函数的特点:(1)函数名相同 (2)参数表不同 ( 参数类型,参数个数 )
  例如,当要求编写求整数、长整型数和双精度数的二次方的函数时,若用C++来处理,上面用C语言处理中3个求二次方的函数可以起一个共同的名字square,但它们的参数类型仍保留不同。因此,当用户调用这些函数时,只需记住一个square函数,编译系统就会根据实参的类型来确定调用哪个重载函数。
例1: 参数类型不同的重载

#include<iostream>
using namespace std;
int square(int i){
        return i*i;
}
long square(long l){
        return l*l;
}
double square(double d){
        return d*d;
}
int main(){
        int i=12;
        long l=1234;
        double d=5.67;
        cout<<i<<'*'<<i<<"="<<square(i)<<endl;
        cout<<l<<'*'<<l<<"="<<square(l)<<endl;
        cout<<d<<'*'<<d<<"="<<square(d)<<endl;
        return 0;
}

例2: 参数个数不同的重载

#include<stdio.h>
using namespace std;
int mul(int x,int y){
        return x*y;
}
int mul(int x,int y,int z){
        return x*y*z;
}
int main(){
        int a=1,b=2,c=3;
        printf("%d * %d = %d\n",a,b,mul(a,b));
        printf("%d * %d * %d = %d\n",a,b,c,mul(a,b,c));
        return 0;
}

注意:
(1) int mul(int x, int y); 和 double mul( int x, int y );
这两个函数的参数个数和参数类型完全相同,只有返回值类型不同,不允许重载。因为编译系统无法从函数的调用形式上判断哪一个函数与之匹配。

(2)函数的重载与带默认值的函数一起使用时,有可能引起二义性,比如说,
void Drowcircle( int r=0, int x=0, int y=0 );
void Drowcircle( int r );
当执行函数调用: Drowcircle(20);
编译系统无法确定调用哪一个函数。

(3)在函数调用时,如果给出的实参和形参类型不相符,C++的编译器会自动地做类型转换工作。如果转化成功,则程序继续执行,在这种情况下,有可能产生不可识别的错误。例如:
void f_a(int x);
void f_a(long x);
虽然这两个函数满足函数重载的条件,但是,如果用下面的数据去调用,就会出现不可分辨的错误:
int c=f_a(5.56);
这是因为编译器无法确定将5.56转换成int 还是long 类型的原因造成的。

猜你喜欢

转载自blog.csdn.net/aaqian1/article/details/83591795
今日推荐