C++的重载函数和重载运算符(前置要求:掌握C语言)

本文详细介绍了C++中的函数重载和运算符重载概念,阐述了为何引入重载以及其定义。通过实例展示了如何实现函数重载,包括不同参数数量和类型的情况,并讨论了直接使用浮点数可能导致的类型转换问题。同时,文章提到了运算符重载的重要性,总结了重载的原理,指出C++在编译时如何处理重载函数。
摘要由CSDN通过智能技术生成

一 为什么引入重载

(一)函数重载

对于功能相同但是处理的数据类型不同时,我们需要针对不同类型分别写不同函数;但是C语言中函数名不能重复,还需要花式起不同的名字;
比如两个数相加的函数,int和int,int和float,int和double,,,每种都得写一个函数,函数名还不能重复,那就得写add_int_int(),add_int_float();add_int_double(),,,好麻烦呀;
C++有了函数的重载,我们可以写不同的函数而用相同的函数名,那么上面例子里的函数全都叫add();我们只需要管处理的数据类型;这多方便;

(二)运算符的重载

二 重载的定义

(一)函数重载

在同一作用域内,函数名相同,形参列表中的参数类型,参数个数,参数顺序三个中至少一个不同的一组函数;
注意点:
1、函数名相同,这是前提,也是目的;
2、重载函数靠形参列表来定义、区分和调用;和返回值类型,函数体的内容,是否是引用,指针等无关;
3、但是重载函数的代码或者说功能应该相似,否则为什么用相同的函数名呢?
4、函数返回值类型,按需选取,与重载无关;

(二)运算符重载

三 重载的代码举例

(一)函数重载

写一个相加的例子:

#include <iostream>
using namespace std;
int add(int a, int b)
{
    return a+b;
}
int add(int a, int b, int c)
{
    return a+b+c;
}
double add(double a, double b)
{
    return a+b;
}
double add(int a, double b)
{
    return a+b;
}
double add(double a, int b)
{
    return a+b;
}
string add(string a, string b)
{
    return a+b;
}
int main()
{
   cout << add(1, 2) << endl;;
   cout << add(1, 2, 3) << endl;;
   cout << add(1.2, 2.3) << endl;;
   cout << add(1, 2.3) << endl;;
   cout << add(1.2, 2) << endl;;
   cout << add("hello ", "world") << endl;;
   return 0;
}

结果:

3
6
3.5
3.3
3.2
hello world
一点注意事项

直接写3.14这样的实数,默认是double类型;如果调用add(1.2, 2.3);则需要定义add(double, double);
1、如果定义了add(double, double);那么不会出问题;
2、如果没有定义add(double, double)而定义了add(int, int);add(float ,float);这两个中的任一个;编译器不会停下,会把double类型的1.2和2.3被转成int或者float;
(1)是add(int, int);则这两个数会被转成int型的1和2,则返回的结果是3;
(2)是add(float, float);则double转float,如果精度要求高,会丢失精度;本例中精度很低,能有期望值3.5;
3、如果没有定义add(double, double)而同时定义了add(int, int);add(float ,float);则编译不通过;因为编译器不知道到底往哪个类型转;
代码如下:

定义了双double:

#include <iostream>
using namespace std;
int add(int a, int b)
{
    return a+b;
}
float add(float a, float b)
{
    return a+b;
}
double add(double a, double b)
{
    return a+b;
}
int main()
{
   cout << add(1.2, 2.3) << endl;;
   return 0;
}

结果:

3.5

只定义了双int

#include <iostream>
using namespace std;
int add(int a, int b)
{
    return a+b;
}
int main()
{
   cout << add(1.2, 2.3) << endl;;
   return 0;
}

结果:

3

只定义了双float:

#include <iostream>
using namespace std;
float add(float a, float b)
{
    return a+b;
}
int main()
{
   cout << add(1.2, 2.3) << endl;;
   return 0;
}

结果:

3.5

同时定义了双int和双float:

#include <iostream>
using namespace std;
int add(int a, int b)
{
    return a+b;
}
float add(float a, float b)
{
    return a+b;
}
int main()
{
	//编译不通过;
   cout << add(1.2, 2.3) << endl;;
   return 0;
}
编译不通过
(二)运算符重载

四 重载原理

(一)函数重载原理

编译器编译时会对每个函数进行重命名;C语言程序编译时,只会给函数名前加_;相同的函数名经过编译后还是相同,因此C语言中不能有函数名重复;而C++程序在编译时每个函数名会改成记录函数名、返回值类型、每个形参和形参类型的版本;因此,经过编译,C++程序中重载的一组函数每个函数名都不相同,而且可以根据带入的实参类型来判断要调用哪个函数;
所以,C语言不支持函数重载而C++支持;

五 参考

C++中函数重载的理解,8w+阅读量,写的确实好,建议阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值