首页 > 代码库 > C++中的函数重载

C++中的函数重载

一. 函数的参数表严格匹配,空参代表没有任何参数,void形参依然可以使用
二. 不再支持C语言中的隐式声明方式,函数调用前必需先声明或定义
三. 函数的返回类型int不能省略
四. 函数可以重载
     1. 在同一作用域中,函数名相同,参数列表不同的函数可以存在若干个,其返回值任意
     2. 当出现重载函数时,使用函数指针显得有点问题,当给函数指针赋值时,指针的类型代表着具体的函数。
     3. 函数重载的实现是基于函数名的编译时改变
     4. 当程序跨越编译器或由其它语言调用重载函数时,函数名在编译时编译器不能对其改变,否则无法调用
     5. extern“C” 可以告诉编译器,像C语言那样进行编译处理。


//
//  main.cpp
//  day01-Function
//
//  Created by aiqiyisheng on 15/1/11.
//  Copyright (c) 2015年 HYR. All rights reserved.
//

#include <iostream>
using namespace std;

//在C语言中 不写返回值类型 则默认返回整型int
/*
 *
 
fa();//声明   声明的时候参数可以不写,定义的时候可以任意给参数
fa(int a,int b){//定义
    //函数体
}

 *
 */

/*
 
 在C++中的函数一定要写返回值类型,如果没有返回值,则写void空的返回值
 
 C++中的参数如果你不写的话,会默认给你一个void空参数
 
 */


//英雄打怪后增加经验的函数
int addExp(int heroExp,int addExp){
    return heroExp + addExp;
}
//打打怪就会增长百分比的经验
int addExp2(int heroExp,double addExpPtr){
    return heroExp * (1 + addExpPtr);
}

/*
void addExp2(int heroExp,double addExpPtr){
    //重载跟返回值类型无关
}
 */


/*
 * 方法重载
 * 
 
        方法名相同,参数列表不同(参数个数,参数类型,参数顺序) 这样就构成方法重载了   跟返回值类型无关
 
      编译器在编译的时候遇到相同名字的方法,编译器可能会自己生成一个方法名,
例如:int addExp(int heroExp,int addExp)可能会生成这样的方法名int addExp_i_i()....

    int addExp(int heroExp,double addExpPtr)可能会生成这样的方法名int addExp_i_d()...
    在调用的时候编译器会根据你给的参数去找对应的方法
 *
 *
 */


/*
 重写  :子类重写父类的方法
 
 
 */



int addExp(int heroExp,double addExpPtr){
    return heroExp * (1 + addExpPtr);
}



//告诉编译器  该方法按照“C”语言的方式处理  (不会帮你重命名)
extern "C"
void test(){
    cout << "extern \"C\" 的作用" << endl;
}

//主函数
int main(int argc, const char * argv[])
{

    int heroExp = 1000;
    cout << addExp(heroExp, 100) << endl;
    cout << addExp2(heroExp, 0.5) << endl;
    
    cout << addExp(heroExp, 0.5) << endl;
    
    test();
    return 0;
}

运行结果如下:
1100
1500
1500
extern "C" 的作用
Program ended with exit code: 0



另外需要注意的是:  函数重载的时候要注意一点就是如果找不到匹配类型的,或者找到好几个匹配类型的,该如何???

#include <iostream>
using namespace std;

//定义函数   函数重载

//如果找不到匹配的类型,C++会找一个相对合适的类型
//同样  如果找到很多合适的类型  那也不知道该执行那一个,例如注释掉int的方法
//void fa(char ch){ cout << "fa(char ch)" << endl;}
//void fa(short st){ cout << "fa(short st)" << endl;}
void fa(int it){ cout << "fa(int it)" << endl;}
void fa(long lg){ cout << "fa(long lg)" << endl;}
void fa(float ft){ cout << "fa(float ft)" << endl;}
void fa(double de){ cout << "fa(double de)" << endl;}


int main(){
    //声明变量
    char ch;
    short st;
    int it;
    long lg;
    float ft;
    double de;
    //
    fa(ch);
    fa(st);
    fa(it);
    fa(lg);
    fa(ft);
    fa(de);
    
    return 0;
}


运行结果如下:


fa(int it)
fa(int it)
fa(int it)
fa(long lg)
fa(float ft)
fa(double de)
Program ended with exit code: 0












C++中的函数重载