c++总复习

1. 什么是函数重载?

函数重载(Function Overloading)是指在同一个作用域内,可以定义多个同名函数,但是这些同名函数的参数列表必须不同(参数个数、参数类型或者参数顺序不同),函数的返回类型可以相同也可以不同。当调用这个同名函数时,编译器会根据传入的实际参数情况来自动判别应该调用哪一个具体的函数,从而实现不同的功能。

以下是一个 C++ 中函数重载的简单示例:

#include <iostream>// 函数重载示例
void print(int num) {std::cout << "整数: " << num << std::endl;
}void print(double num) {std::cout << "小数: " << num << std::endl;
}void print(const char* str) {std::cout << "字符串: " << str << std::endl;
}int main() {print(10);print(3.14);print("Hello World");return 0;
}

在上述示例中,定义了三个同名函数print,它们分别接受整数、小数和字符串作为参数,通过这种方式,在不同的需求场景下可以使用同一个函数名来实现不同类型数据的输出操作,使得代码在一定程度上更加简洁和易于理解。

2. 函数重载的实现原理是什么?

函数重载的实现原理主要涉及到编译器在编译阶段的处理过程,具体如下:

名字修饰(Name Mangling)

不同的编程语言实现函数重载的方式可能略有不同,但大多数采用了名字修饰的机制。在 C++ 等语言中,当编译器遇到函数重载的情况时,它并不会简单地按照函数的原始名称来处理,而是会对函数的名称进行一种特殊的变换,这个过程称为名字修饰。

例如,对于上述示例中的三个print函数,编译器在编译时可能会根据函数的参数类型、参数个数等信息对函数名进行修饰,使得每个函数都有一个独一无二的、经过修饰后的名称。具体来说,可能会把print(int)函数修饰成类似于_Z5printi的形式(这里只是示意,实际的修饰规则因编译器而异),把print(double)函数修饰成_Z5printd,把print(const char* str)函数修饰成_Z5printPKc等等。

这样做的目的是,当在程序中调用print函数时,编译器可以根据传入的实际参数类型准确地判断出应该调用哪一个经过修饰后的具体函数,而不会出现混淆。

函数匹配(Function Matching)

当程序在调用重载函数时,编译器会按照一定的规则来进行函数匹配,以确定应该调用哪一个具体的函数。这个过程主要包括以下几个步骤:

  1. 精确匹配(Exact Matching):首先,编译器会寻找与传入的实际参数在参数类型、参数个数和参数顺序上完全一致的函数。如果能找到这样的函数,那么就会调用这个函数。例如,在上面的示例中,如果调用print(10),编译器会首先寻找接受整数类型且参数个数为 1 的函数,显然print(int)函数符合要求,所以就会调用它。

  2. 提升匹配(Promotion Matching):如果没有找到精确匹配的函数,编译器会考虑参数类型的提升情况。比如,对于一些基本类型,在某些情况下会进行类型提升,如char类型可能会提升为int类型等。如果经过类型提升后能找到匹配的函数,那么就会调用这个函数。

  3. 标准转换匹配(Standard Conversion Matching):如果提升匹配也失败了,编译器会考虑标准转换的情况。例如,将int类型转换为double类型等标准转换操作。如果通过标准转换后能找到匹配的的函数,那么就会调用这个函数。

  4. 用户自定义转换匹配(User-Defined Conversion Matching):如果前面几种匹配方式都失败了,并且程序中存在用户自定义的转换函数(比如类中定义了从一种类型转换到另一种类型的函数),那么编译器会考虑这些用户自定义转换的情况,看是否能通过这些转换找到匹配的函数。

  5. 函数模板匹配(Function Template Matching):如果以上所有匹配方式都失败了,并且程序中存在相关的函数模板,那么编译器会考虑函数模板匹配的情况,看是否能通过应用函数模板生成一个符合要求的函数来进行调用。

通过以上一系列的名字修饰和函数匹配过程,编译器能够准确地处理函数重载的情况,使得程序员可以在同一个作用域内定义多个同名函数来实现不同的功能,同时保证程序在调用这些函数时能够正确地运行。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483221.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络分层模型( OSI、TCP/IP、五层协议)

1、网络分层模型 计算机网络是一个极其复杂的系统。想象一下最简单的情况&#xff1a;两台连接在网络上的计算机需要相互传输文件。不仅需要确保存在一条传输数据的通路&#xff0c;还需要完成以下几项工作&#xff1a; 发起通信的计算机必须激活数据通路&#xff0c;这包括发…

采药 刷题笔记 (动态规划)0/1背包

P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生态 动态规划 0/1背包 的本质在于继承 一行一行更新 上一行是考虑前i个物品的最优情况 当前行是考虑第i1个物品的情况 当前行的最优解 来自上一行和前i个物品的最优解进行比较 如果当前装了当前物品&#xff…

汽车操作系统详解

目录 1. 车控汽车操作系统 2. 车载汽车操作系统 3. OEM定制操作系统 刚开始工作的时候&#xff0c;接触的是汽车控制相关的开发工作&#xff0c;天真地以为汽车操作系统就是指实时操作系统&#xff0c;例如FreeRTOS、OSEK OS、AUTOSAR OS等等&#xff1b;然而&#xff0c;随…

Shire 1.1 发布:更强大的交互支持,升级 AI 智能体与 IDE 的整合体验

在经过多个项目上的试用后&#xff0c;我们进入了持续的修修补补&#xff0c;以及功能的增强阶段。终于&#xff0c;我们发布了 Shire 1.1 版本&#xff0c;这个版本带来了更强大的交互支持&#xff0c; 多功能升级 AI 与 IDE 的整合体验。 交互&#xff1a;丰富与大量 IDE 插件…

Springboot(四十九)SpringBoot3整合jetcache缓存

上文中我们学习了springboot中缓存的基本使用。缓存分为本地caffeine缓存和远程redis缓存。现在有一个小小的问题,我想使用本地caffeine缓存和远程redis缓存组成二级缓存。还想保证他们的一致性,这个事情该怎么办呢? Jetcache框架为我们解决了这个问题。 ‌JetCache‌是一个…

学习笔记052——Spring Boot 自定义 Starter

文章目录 Spring Boot 自定义 Starter1、自定义一个要装载的项目2、创建属性读取类 ServiceProperties3、创建 Service4、创建自动配置类 AutoConfigration5、创建 spring 工程文件6、将项目打成 jar 包7、jar 打包到本地仓库8、配置application.yml Spring Boot 自定义 Starte…

专业清洁艺术,还原生活本色——友嘉高效除菌洗碗机

生活中&#xff0c;每个人都渴望拥有一份洁净的生活环境。而家&#xff0c;作为我们最温馨的港湾&#xff0c;对洁净的追求更是无时无刻不在进行。每当饭后的欢声笑语过后&#xff0c;面对一堆沾满油渍、藏匿着细菌的餐具&#xff0c;我们不禁感到一丝烦忧。然而&#xff0c;有…

C++类与对象(二)

一、默认成员函数 class A{}; 像上面一样&#xff0c;一个什么都没有的类叫做空类&#xff0c;但是这个什么都没有并不是真正的什么都没有&#xff0c;只是我们看不见&#xff0c;空类里面其实是有6个默认成员函数的&#xff0c;当我们在类里面什么都不写的时候&#xff0c;编译…

PHP RabbitMQ连接超时问题

问题背景 Error: The connection timed out after 3 sec while awaiting incoming data 看到这个报错&#xff0c;我不以为意&#xff0c;认为是我设置的超时时间不够导致的&#xff0c;那就设置长一点 Error: The connection timed out after 300 sec while awaiting incom…

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和perr…

使用CertD全自动申请和部署SSL证书至服务器

1. Certd简介 Certd是一个开源的证书生命周期管理系统&#xff0c;专注于帮助开发者和组织更加便捷、安全地管理他们的数字证书。无论是在小型个人项目中还是大型企业环境中&#xff0c;Certd都能提供强大的功能&#xff0c;确保您的HTTPS服务始终处于安全状态。 1.1. 技术分…

uniapp实现加密Token并在每次请求前动态更新(vue、微信小程序、原生js也通用!)

导语&#xff1a;在Web开发中&#xff0c;Token作为一种身份验证的机制&#xff0c;被广泛应用于前后端交互过程中。本文将为大家介绍如何在每次请求前动态设置加密的Token&#xff0c;并在请求一次后使Token值加1&#xff08;或其他动态改变的逻辑&#xff09;&#xff0c;从而…

idea打jar包或引入包

一&#xff0c;通过Maven的方式打jar包 将相要打包的依赖写入到pom.xml文件中&#xff0c;如下所示&#xff1a; 然后使用打包命令&#xff1a; maven package 就能按照pom.xml中设置的打包了。 二&#xff0c;通过idea打包 前段时间遇到一个情况是使用Maven打包的时候src主程…

uniapp在App端引用echarts组件,解决无法渲染formatter问题

在App端option里面直接写上formatter&#xff0c;是无法执行方法的。 解决办法&#xff1a; 需要在echarts组件里面给options再重新赋值 效果图

pytest(二)excel数据驱动

一、excel数据驱动 excel文件内容 excel数据驱动使用方法 import openpyxl import pytestdef get_excel():excel_obj openpyxl.load_workbook("../pytest结合数据驱动-excel/data.xlsx")sheet_obj excel_obj["Sheet1"]values sheet_obj.valuescase_li…

ubuntu 和windows时区设置和时间修改

windows 时区设置 查看当前时区 tzutil /g 列出可选的时区&#xff0c;参考 时区列表备份 tzutil /l 设置时区 tzutil /s "China Standard Time" 修改日期和时间&#xff0c;直接输入date或者time修改 ubuntu 时区设置 timedatectl指令列表&#xff1a;list-timez…

卷积神经网络(CNN)的层次结构

卷积神经网络&#xff08;CNN&#xff09;是一种以其处理图像和视频数据的能力而闻名的深度学习模型&#xff0c;其基本结构通常包括以下几个层次&#xff0c;每个层次都有其特定的功能和作用&#xff1a; 1. 输入层&#xff08;Input Layer&#xff09;&#xff1a; 卷积神经网…

图像与文字的创意融合:使用Python进行视觉艺术创作

原图&#xff1a; 处理过的&#xff1a; import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont import os# 字体文件路径 vfont ./fonts/方正像素字体.ttfdef text_paint(img_path, text, font_path, font_size):# 使用 OpenCV 加载图片img cv2.i…

【Markdown编辑器】

Markdown编辑器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注…

Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)

目录 前言 在开发过程中&#xff0c;我们经常遇到一些看似简单的问题&#xff0c;但有时正是这些细节问题让我们头疼不已。今天&#xff0c;我就来和大家分享一个我在开发过程中遇到的 el-switch 使用的小坑&#xff0c;希望大家在使用时能够避免。 一. 问题背景 二. 问题分…