【C++初学者自学笔记二】函数重载(模块一)

1.概念:同意作用域的一组参数列表不同,函数名相同的函数,这组函数叫函数重载(C语言是不能定义相同名称的函数,但是C++可以允许定义)。

2作用:重载函数通常来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有着很大的好处(一物多用)。参数列表不同:1.参数类型不同 2.参数顺序不一样 3.参数个数不同 ;重载版本根据参数匹配度进行选择(根据不同的情况函数重载会有不同)当我传入两个double型的数据,我们又定义几个不同类型的参数,最后还是会选择double类型的重载。

注意:

1.1 与函数参数的变量名无关

1.2 函数的返回值类型与重载无关

2.函数重载的实现原理是通过C++实现的extern “C” int fun()(没有形成换名)的形式可以c的方式生成函数名(无换名机制)

3.使用场景:当函数基本上执行相同的任务的时候,使用不同形式的数据时

我知道概念很难懂又晦涩,我也一样,看下面这个特别简单的代码你会发现重载其实很好理解:

#include<iostream>
using namespace std;
namespace Chongzai_one{
    void add(int a,int b){
        cout<<"int+int="<<a+b<<endl;
    }
    void add(int a,double b){
        cout<<"int+double="<<a+b<<endl;
    }
    void add(double a,double b){
        cout<<"double+double="<<a+b<<endl;
    }
}//函数名相同,参数列表不同是因为他们的参数类型不同
int main(){
    using namespace Chongzai_one;
    add(1,2);//得到的结果为3
    add(1,2.5);//得到的结果为3.5
    add(2.3,2.3);//得到的结果为4.6
    getchar();
    return 0;
}

看懂了吧。这三个add函数它们的功能都是加法只是参数类型不同,如果用不同的名字反而会影响程序的可读性。当然你想写成字符串形式也是可以的(PS:下面n+m最后会显示的是字符ASCLL的合)看下面代码:

namespace Chongzai_two{
    void print(char n){
        cout<<"show1="<<n<<endl;
    }
    void print(char n,char m){
        cout<<"show2="<<n+m<<endl;
    }
}

参数类型相同或者返回类型不同但参数类型相同都是不会形成重载的。如果我把第一个代码中的第一个重载函数的void改成int,把参数类型换成和第二个重载函数一样那么它就会报错。当出现extern "C" int fun();的时候,则是用C语言运行程序,此时的函数名将不会改变,例如下面这个代码:

extern "C" int fun(int a,int b){
    cout<<"a+b="<<a+b<<endl;
}
int fun(double a,double b){
    cout<<"a+b"<<a+b<<endl;
}

其实这个代码并没有变更函数名,启动后台程序发现还是会有两个fun函数,这就是extern在这里的用法,此外extern还可以作为调用同一个工程下其他文件内的命名空间。这里只是简单的介绍了一下,以后还会在博客里会重点介绍函数的用法。

猜你喜欢

转载自www.cnblogs.com/chenxi1944362410/p/12286907.html