6.4 函数重载

news/2024/11/18 8:22:01/

文章目录

      • 定义重载函数
      • 判断两个形参是否相同
      • 重载和const形参
      • const_cast和重载
      • 调用重载函数
    • 重载与作用域

如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。但值得注意的是main函数无法重载。

定义重载函数

对于重载的函数来说,它们应该在形参数量或形参类型上有所不同。不允许两个函数除了返回类型外其他所有的要素都相同。

判断两个形参是否相同

可以使用decltype进行相对应的判断。

重载和const形参

如介绍的,顶层const 不影响传入函数的对象。一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来:

int function(int i){}
int function(const int i){}//错误,重复定义都为顶层const
//
int function(int* p){}
int function(int* const p){}//错误,重复定义都为顶层const

但是如果是底层const的话就可以区分开来了:

int function(int* i){}//指向i的指针(非常量)
int function(const int* i){}//新函数,指向常量的指针

int function(int& i){}//作用于i的引用(非常量)
int function(const int& i){}//新函数,常量的引用

const_cast和重载

主要的应用场合:

样例:

#include<iostream>
#include<string>using namespace std;const string& function(const string& s1,const string& s2 )
{return s1.size() < s2.size() ? s1 : s2;
}string& function(string& s1, string& s2)
{auto& r = function(const_cast<const string&> (s1), const_cast<const string&> (s2));return const_cast<string&>(r);
}int main()
{return 0;
}

在这个版本的函数中,首先将它的实参强制转换成对const 的引用,然后调用了function函数的const版本。const版本返回对const string 的引用,这个引用事实上绑定在了某个初始的非常量实参上。因此,我们可以再将其转换回一个普通的string&,这显然是安全的。

调用重载函数

定义了一组重载函数后,我们需要以合理的实参调用它们。函数匹配是指一个 过程,在这个过程中我们把函数调用与一组重载函数中的某一个关联起来,函数匹配也叫做重载确定。编译器首先将调用的实参与重载集合中每一个函数的形参进行比较,然后根据比较的结果决定到底调用哪个函数。

总而言之,步骤如下:

  1. 将所有的同名函数作为候选者。
  2. 尝试寻找可行的候选者.
    (1)精确匹配实参类型。
    (2)通过默认参数能够匹配的实参类型。
    (3)通过默认类型转换匹配实参。
  3. 最佳匹配(优先级,从上至下,从高到低)
    (1)精确匹配。
    (2)通过const转化实现匹配(底层const)
    (3)通过类型提升实现的匹配
    (4)通过算术类型转换实现的匹配。
    (5)通过类类型转换实现的匹配

重载与作用域

一般来说,将函数声明置于局部作用域内不是一个明智的选择。对于刚接触C++的程序员来说,不太容易理清作用域和重载的关系。其实,重载对作用域的一般性质并没有什么改变:如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名。

其主要的原因便是:在C++语言中,名字查找发生在类型检查之前。

故我们对于函数的声明应全部写在最外层或者写在一个专门的头文件中。


http://www.ppmy.cn/news/8354.html

相关文章

Python + Django开发在线考试管理系统(附源码)

本文最终实现一个Web在线考试管理系统&#xff0c;可作为Python Web&#xff0c;Django的练手项目&#xff0c;也可以作为计算机毕业设计参考项目。 文章目录系统功能需求分析系统设计及实现思路源码分享&系统实现过程系统展示系统功能需求分析 在线考试管理系统&#xff…

Authing Share|系统安全与防范

概述 随着信息产业的迅猛发展&#xff0c;网络的安全机制与技术也在不断地变化&#xff0c;现在&#xff0c;网络安全技术不再是一种统一的技术和策略&#xff0c;它已经成为了一个十分复杂的系统工程&#xff0c;拆分来说系统安全可细分为用户安全、密码安全、网络应用安全和…

canopen11-sdo-40读取命令

源码 参考文件 1、SDO介绍 就对象而言,主机要访问节点词典的数据,因此主机是client客户端,节点是server服务器。上传与下载是对服务器来说的(这点和常识有点不太一样)。因此,上传指的是服务器发送数据给客户端,下载是客户端给服务器数据。 我们这里要用主机访问节点服…

【算法】静态单链表、双链表、单调栈与单调队列

文章目录1.单链表2.双链表3.单调栈4.单调队列1.单链表 考虑到效率问题&#xff0c;如果每次都去new结点效率比较慢&#xff0c;平时做题时不采用动态:在有严格的时间要求的环境中&#xff0c;不能频繁使用new操作,new的底层涉及内存分配&#xff0c;调用构造函数&#xff0c;指…

LVGL学习笔记9 - 标签Label

目录 1. 显示字符串 1.1 lv_label_set_text 1.2 lv_label_set_text_fmt 1.3 lv_label_set_text_static 2. 设置长字符串模式 3. 改变颜色 3.1 改变背景颜色和对比度 3.2 设置字符串颜色 3.2.1 设置Style的字符串颜色 3.2.2 设置对象的字符串颜色 3.2.3 局部改色 显示…

【MyBatis】如何使用“注解”来获取参数,以及其他方式?(底层原理解释)

目录 一、获取参数办法 1.1、多个参数时&#xff0c;直接传参&#xff0c;通过arg0...或param1...实现 1.2、通过传入map实现 1.3、实体化类对象传参 二、使用注解获取参数&#xff08;最实用&#xff01;建议经常使用&#xff09; 三、建议&#xff01;&#xff01;&…

设备驱动分类、设备号、字符设备

一、设备驱动分类 设备驱动分为三大类&#xff1a;字符设备、块设备、网络设备 1.字符设备 该设备对数据的处理按照字节流的形式进行的&#xff0c;支持顺序访问&#xff08;是有时间的概念&#xff09;&#xff0c;也可以支持随机访问 典型的字符设备:串口、键盘、触摸屏、…

Git小本

一、Git 概述 Git 是 Linus Torvalds 为了帮助管理 Linux内核开发的一个开源的版本控制软件。 Linux之父(Linus Torvalds)的代表作&#xff1a;Linux、Git。 1. 为什么要用Git&#xff1f; Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xf…