函数重载

2023-10-19 14:44:05 浏览数 (2)

在写运算符重载之前,我发现我好像没有写过函数重载,也算一个知识点 补一下。 函数重载(多态)是可以让我们使用同名函数,比如

代码语言:javascript复制
#include <iostream>
using namespace std;
 
class printData
{
   public:
      void print(int i) {
        cout << "整数为: " << i << endl;
      }
 
      void print(double  f) {
        cout << "浮点数为: " << f << endl;
      }
 
      void print(char c[]) {
        cout << "字符串为: " << c << endl;
      }
};
 
int main(void)
{
   printData pd;
 
   // 输出整数
   pd.print(5);
   // 输出浮点数
   pd.print(500.263);
   // 输出字符串
   char c[] = "Hello C  ";
   pd.print(c);
 
   return 0;
}

代码来自菜鸟教程,因为我实在想不到什么好例子了。 函数重载的关键是函数的参数列表 也叫函数特征标 如果两个参数数目和类型相同,同时参数的排列顺序也相同,则他们的特征标相同,变量名与返回值是无关紧要的。 分析一下书上的例子

代码语言:javascript复制
void print(const char *str,int width);
void print(double,int width);
void print(long l,int width);
void print(int i,int width);
void print(const char*str);

当使用函数时,编译器会对应相应的特征标

代码语言:javascript复制
print("hello",5);//##1
print(5.0,6);//##2
print(55,35);//##3
print(14,16);//##4
print("name");//##5

如果我们的调用代码是

代码语言:javascript复制
unsigned int year = 3210;
print(year,6);

会与上述哪个函数对应呢?不会,因为没有对应的特征标,但是编译器不会报错,而是给我强制转换成了其他可以转换的类型的函数,unsigned int 可以转为int long double等等 之前我介绍过数据类型的转换可以去看一下。如果只是一个的话,我们可以对应强制转换的那一个函数,但是现在有三个选择,既然选择不了,那只能报错了。 然后我们再来总结一些规则

编译器在检查特征时,把类型引用和类型本身视为一个特征标

代码语言:javascript复制
double cube(double&c);
double cube(double c);

这并不是函数重载(overload)

关于const参数和非const参数重载 书上说不区分const和非const,但实际上非const可以赋值给const,而const不能赋值给非const,也就是说调用函数参数如果是const,那可以重载const和非const,如果是非const,则只能重载非const匹配调用,如果重载const和非const都有的话,匹配对应类型即可,这怎么看也不像是不区分const的意思,有大神告知一下嘛

引用函数的重载

我看其他人做笔记基本上都是上一部分,但是我看的这本书既然讲了,不做笔记,感觉不自在。 我们在之前写类的时候,会经常用到引用,所以我单独写了一篇引用的总结,重新复习一下这个知识点。 前面说引用和原类型在编译器看来是一样的,那如果我们对引用类型参数进行重载呢

代码语言:javascript复制
void staff(double&s);//##1
void staff(const double&c);//##2
void stove(double&c);//##3
void stove(const double&s2);//##4
void stove(double&&r3);//##5

/##1可以匹配double类型,因为他们是一样的,##2可以匹配double const double or (double x double y)

重载示例

何时使用函数重载

当函数执行相同的任务,但使用不同形式的的数据时,才采用重载函数。编译器是如何区分重载函数呢。它会对函数执行一些名称修饰,他根据函数原型中指定的形参类型对每个函数名进行加密,通过对原始名称进行的表面看来无意义的修饰将对参数数目和类型进行编码,修饰也是围绕特征标进行,而修饰的约定随编译器而异。

0 人点赞