跳转至

重载

约 758 个字 31 行代码 预计阅读时间 3 分钟

c++支持重载,C语言不支持

重载概念摘自百度百科

重载函数 是函数的一种特殊情况,为方便使用,C++允许在 同一范围中声明几个功能类似的同名函数 ,但是这些同名函数的 形式参数 (指参数的个数、类型或者顺序)必须不同,也就是说用 同一个函数完成不同的功能 。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。

重载既可以对函数重载也可以对符号重载。

重载函数

在平常有很多使用的函数都能看成重载函数。

比如 maxminsort 等等,因为他们对于很多类型都适用,比如 sort 可以 sort 整数,小数,字符,结构体等等等等, 粗略的 就可以想成他对于每个类型都有一个sort函数,然后根据类型来调用对应的函数。

淼爷的头文件板子里可以发现所有的快读函数名和快写函数名的名字都是一样的,快读为read,快写为write。那么都程序不会弄混用错函数么?

doublestring的读入为例:

inline void read(double &x){
    double z=0,t=0;int s=0,f=1;char c=getchar();
    while (!isdigit(c)) {if (c=='-') f=-1; if(c=='.') goto readt; c=getchar();}
    while (isdigit(c)&&c!='.') {z=z*10+c-'0';c=getchar();}
    readt:while (c=='.') c=getchar();  
    while (isdigit(c)) {t=t*10+c-'0';++s; c=getchar();}
    x=(z+t/pow(10,s))*f;
}

inline void read(string& x){
    x="";
    char ch=getchar();
    while(ch==' ' || ch=='\n' || ch=='\r')ch=getchar(); 
    while(ch!=' ' && ch!='\n' && ch!='\r') x+=ch,ch=getchar();
}

运行以下语句:

    double num;
    string str;
    read(num); // 调用1号read
    read(str); // 调用2号read

当程序发现有多个read时,他会根据参数来选择最佳的函数或者报错不调用。

运行第一个read时,参数为double类型,程序会扫描所有的read,发现1号read的参数也为double,完美适配,那么他会调用1号read,读入double

运行第二个read时,参数为string类型,同理,发现2号read的参数也为string,完美适配,则调用2号read,读入string

所以对于同名函数来说,程序来确认运行哪个函数是根据参数来确定调用的。区别可以为参数类型,参数个数,参数顺序。


重载运算符

重载运算符与重载函数相同,也是根据参数类型来确认的。只是他的格式不一样。

[返回类型] operator[符号] (参数1,...){
    return [];
}

常见的重载运算符有string+,因为字符串其实是没有加法的,只有拼接,可以用重载运算符来实现拼接。

可以写一个string的乘法,定义乘法为翻倍。

string operator * (string str, int num){
    string ans = "";
    for(int i = 0;i < num;i++){
        ans = ans + str;
    }
    return ans;
}

这样便实现了对string的乘法。

    string str = "abcd"; // str = "abcd"
    str = str * 4; // str = "abcdabcdabcdabcd"

C++运行对很多运算符进行重载。

可重载运算符:

运算符类型 运算符
双目运算符 +,-,*,/,%
关系运算符 ==,!=,<,>,<=,>=
逻辑运算符 ||,&&,!
单目运算符 +(正),-(负),*(指针),&(取地址)
自增自减 ++,--
位运算 |,&,~,^,<<,>>
赋值运算符 =,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=
空间申请与释放 new,delete,new[],delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标)

不可重载:

运算符 解释
. 成员访问运算符
.*, ->%* 成员指针访问运算符
:: 域运算符
?: 条件运算符
sizeof 长度运算符
# 预处理运算符