一、函数重载:同名函数的 “差异化生存”​

1. 概念定义​

函数重载(Function Overloading)是 C++ 的重要特性,指在同一作用域内,允许存在多个同名函数,但要求这些函数的参数列表必须不同。

(参数个数、参数类型、参数顺序至少有一项不同)非常重要!!

编译器会根据调用时传入的实参,自动匹配到对应的函数,实现 “一个函数名,多种功能” 的效果。

2. 典型案例分析​

案例 1:参数个数不同的重载​

#include <iostream>
using namespace std;// 无参数版本
void print() {cout << "无参数调用" << endl;
}// 1个int参数版本
void print(int a) {cout << "int参数:" << a << endl;
}// 2个int参数版本
void print(int a, int b) {cout << "两个int参数:" << a << " " << b << endl;
}int main() {print();          // 匹配无参数版本print(10);        // 匹配1个int参数版本print(20, 30);    // 匹配2个int参数版本return 0;
}

​输出结果:​

无参数调用
int参数:10
两个int参数:20 30

案例 2:参数类型不同的重载​

#include <iostream>
using namespace std;// int类型参数
int add(int a, int b) {return a + b;
}// double类型参数
double add(double a, double b) {return a + b;
}int main() {cout << "int加法:" << add(3, 5) << endl;       // 匹配int版本,输出8cout << "double加法:" << add(2.5, 4.5) << endl; // 匹配double版本,输出7.0return 0;
}

注意:仅返回值类型不同的函数,不能构成重载。例如int add(int a)和double add(int a),编译器无法通过调用语句(如add(10))区分,会报 “重定义” 错误。​

案例 3:参数顺序不同的重载​

#include <iostream>​#include <string>​using namespace std;​​// 先int后string​void showInfo(int age, string name) {​cout << "年龄:" << age << ",姓名:" << name << endl;​}​​// 先string后int​void showInfo(string name, int age) {​cout << "姓名:" << name << ",年龄:" << age << endl;​}​​int main() {​showInfo(20, "张三"); // 匹配先int后string版本​showInfo("李四", 22); // 匹配先string后int版本​return 0;​}​​

输出结果:​

年龄:20,姓名:张三​姓名:李四,年龄:22​​

案例 4:多文件分离(声明与定义分离)​

实际项目中,函数重载常涉及多文件拆分,需注意 “声明与定义的一致性”。​

#ifndef FUNC_H
#define FUNC_H  // 防止头文件重复包含// 声明3个重载函数
void calculate(int a);
void calculate(double a);
void calculate(int a, double b);#endif
#include "func.h"
#include <iostream>
using namespace std;void calculate(int a) {cout << "int参数计算:" << a * 2 << endl;
}void calculate(double a) {cout << "double参数计算:" << a * 3 << endl;
}void calculate(int a, double b) {cout << "int+double参数计算:" << a + b << endl;
}

#include "func.h"
int main() {calculate(5);        // 匹配int版本,输出10calculate(3.5);      // 匹配double版本,输出10.5calculate(2, 4.8);   // 匹配int+double版本,输出6.8return 0;
}

编译运行:需将三个文件一起编译(如g++ main.cpp func.cpp -o test),确保声明的重载函数在定义文件中都有对应的实现,否则会报 “未定义引用” 错误。​

3. 原理:为什么 C++ 支持,C 语言不支持?​

核心原因在于编译器对函数名的 “修饰规则” 不同:​

  • C 语言:编译器会直接使用函数原名作为最终的 “符号名”(如函数add(int a, int b),符号名就是add)。若存在同名函数,符号名重复,链接阶段会报错,因此 C 语言不支持函数重载。​
  • C++ 语言:编译器会根据函数的参数列表对函数名进行 “修饰”(也称 “命名粉碎”,Name Mangling),生成唯一的符号名。例如:​
  • add(int a, int b)可能被修饰为_Z3addii(3表示函数名长度,ii表示两个 int 参数);​
  • add(double a, double b)可能被修饰为_Z3adddd。​

不同重载函数的修饰后符号名不同,编译器和链接器能准确识别,因此 C++ 支持函数重载。​

4.引用:变量的 “别名” 与权限控制​

1. 概念定义​

引用(Reference)是 C++ 引入的新特性,本质是变量的别名,它与原变量共享同一块内存空间,对引用的操作等同于对原变量的操作。语法格式为:类型& 引用名 = 原变量;。​

注意:引用必须在定义时初始化,且初始化后不能再指向其他变量(与指针的核心区别)。​

2. 基础操作:定义与使用​

#include <iostream>​using namespace std;​​int main() {​int a = 10;​int& ref_a = a; // 定义引用ref_a,作为a的别名​​cout << "a的值:" << a << endl; // 输出10​cout << "ref_a的值:" << ref_a << endl; // 输出10(与a共享内存)​​ref_a = 20; // 操作引用,等同于修改a​cout << "修改后a的值:" << a << endl; // 输出20​​cout << "a的地址:" << &a << endl; // 输出a的地址(如0x7ffeefbff4ac)​cout << "ref_a的地址:" << &ref_a << endl; // 输出相同地址(证明共享内存)​return 0;​}​​

3. 权限控制:放大、缩小与平移​

引用的权限遵循 “不能放大原变量的权限” 原则,否则编译器会报错;权限缩小或平移是允许的。以下是典型案例:​

案例 1:权限平移(同权限引用)​

原变量是普通变量,引用也为普通引用,权限一致,合法。​

int a = 10;​int& ref_a = a; // 合法:普通变量→普通引用,权限平移​

案例 2:权限缩小(原变量权限 > 引用权限)​

原变量是普通变量(可读可写),引用为const引用(只读),权限缩小,合法。​

int a = 10;​const int& ref_a = a; // 合法:普通变量→const引用,权限缩小​​ref_a = 20; // 错误:const引用只读,不能修改​a = 20; // 正确:原变量是普通变量,可修改(修改后ref_a的值也会变)​​

案例 3:权限放大(原变量权限 < 引用权限)​

原变量是const变量(只读),引用为普通引用(可读可写),权限放大,非法。​

const int a = 10; // a是const变量,只读​int& ref_a = a; // 错误:const变量→普通引用,权限放大,编译器报错​​

案例 4:临时变量的引用(易混淆点)​

临时变量(如表达式结果、字面量)的权限是 “只读”,只能用const引用接收,否则会触发权限放大错误。​

​// 错误案例:临时变量→普通引用(权限放大)​int& ref1 = 10; // 错误:10是临时变量,只读,普通引用无法接收​int& ref2 = 3 + 5; // 错误:3+5的结果是临时变量,只读​​// 正确案例:临时变量→const引用(权限缩小)​const int& ref3 = 10; // 合法:const引用可接收临时变量​const int& ref4 = 3 + 5; // 合法:临时变量值为8,ref4指向该临时变量​​

易错点总结​

  1. 引用未初始化:定义引用时必须绑定原变量,否则报错。​

错误:int& ref;(编译器提示 “引用必须初始化”)。​

  1. 引用指向临时变量未加 const:如上述案例 4,临时变量只能用const引用接收,普通引用会触发权限放大错误。​
  1. 混淆引用与指针:引用初始化后不能改指向,指针可以改指向;引用不需要解引用(*),指针需要。​

错误:int a=10, b=20; int& ref=a; ref=&b;(试图让引用指向 b,编译器报错)。​

  1. 数组引用的语法错误:数组引用需指定数组大小,语法格式为类型 (&引用名)[数组大小] = 原数组;。​

错误:int arr[5] = {1,2,3,4,5}; int& ref_arr = arr;(未指定数组大小);​

正确:int (&ref_arr)[5] = arr;。​

总结​

  1. 函数重载:C++ 通过 “参数列表不同” 实现同名函数的重载,核心原理是编译器对函数名的 “修饰规则”(根据参数列表生成唯一符号名),而 C 语言因无此修饰,不支持重载。​
  1. 引用:本质是变量的别名,需初始化且不可改指向;权限控制遵循 “不能放大” 原则,临时变量需用const引用接收,避免权限相关错误。

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

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

相关文章

2025-08-17 李沐深度学习16——目标检测

文章目录1 介绍1.1 实际应用1.2 边界框1.3 数据集2 锚框2.1 什么是锚框2.2 交并比2.3 分配标签2.4 非极大值抑制3 经典目标检测网络3.1 R-CNN3.1.1 R-CNN (原始版本)3.1.2 Fast R-CNN3.1.3 Faster R-CNN3.1.4 Mask R-CNN3.2 单阶段检测器&#xff1a;SSD 和 YOLO3.2.1 SSD (Sin…

Bluedroid vs NimBLE

&#x1f539; 对比&#xff1a;Bluedroid vs NimBLE 1. 协议栈体积 & 内存占用 Bluedroid&#xff1a;体积大&#xff0c;RAM 占用也大&#xff08;几十 KB 到上百 KB&#xff09;。NimBLE&#xff1a;轻量级&#xff0c;内存占用大概是 Bluedroid 的一半甚至更少。 &…

(纯新手教学)计算机视觉(opencv)实战八——四种边缘检测详解:Sobel、Scharr、Laplacian、Canny

边缘检测详解&#xff1a;Sobel、Scharr、Laplacian、Canny边缘检测是图像处理和计算机视觉中的重要步骤&#xff0c;主要用于发现图像中亮度变化剧烈的区域&#xff0c;即物体的轮廓、边界或纹理特征。OpenCV 提供了多种常用的边缘检测算子&#xff0c;本教程将通过四种方法带…

PyTorch 环境配置

目录一、安装 CUDA二、安装 PyTorch1. 创建虚拟环境2. 安装 PyTorch三、在 PyCharm 上创建一个 PyTorch 项目参考文章&#xff1a; 【2025年最新PyTorch环境配置保姆级教程&#xff08;附安装包&#xff09;】 【超详细 CUDA 安装与卸载教程&#xff08;图文教程&#xff09;】…

鸿蒙中冷启动分析:Launch分析

启动的分类&#xff08;热身环节&#xff09; 启动动类型触发条件系统开销 & 速度主要优化方向冷启动应用进程不存在&#xff08;首次启动或进程被杀后启动&#xff09;最高&#xff0c;需创建进程、加载资源、初始化所有组件主要优化目标&#xff0c;减少主线程任务&…

告别盲目排查,PolarDB+DAS Agent智能运维新突破

1.概述 周五下午6点正准备下班&#xff0c;数据库CPU突然爆满&#xff0c;业务告警响成一片&#xff0c;DBA却要手动翻查CPU/内存/负载等多个监控指标&#xff0c;还要查询是否有新增慢SQL&#xff0c;死锁等问题&#xff1f;” 这可能是数据库DBA最闹心的场景了&#xff0c;…

Linux------《零基础到联网:CentOS 7 在 VMware Workstation 中的全流程安装与 NAT 网络配置实战》

&#xff08;一&#xff09;Linux的发行版Centos安装与配置 下载Linux发行版本Centos:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云点击CentOS-7-x86_64-DVD-2009.torrent &#xff0c;CentOS-7-x86_64-DVD-2009.torrent是官方提供的 BT 种子文件&#xff08;176.1 KB&a…

iOS App 混淆工具实战,教育培训类 App 的安全保护方案

随着在线教育、企业培训、知识付费平台的兴起&#xff0c;越来越多的 iOS 应用需要保护自己的课程资源和核心逻辑。然而&#xff0c;教育类 App 面临的最大风险并非传统的外挂或刷分&#xff0c;而是 视频盗链、题库数据泄露、源码逻辑被二次利用。 在这种场景下&#xff0c;合…

RabbitMQ:SpringAMQP Topic Exchange(主题交换机)

目录一、案例需求二、基础配置三、代码实现TopicExchange与DirectExchange类似&#xff0c;区别在于RoutingKey可以是多个单次的列表&#xff0c;并且以.分割。 Queue与Exchange指定BindingKey时可以使用通配符&#xff1a; #&#xff1a;代指0个或多个单词。*&#xff1a;代…

(纯新手教学)计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)

图像形态学在图像处理中&#xff0c;形态学&#xff08;Morphology&#xff09; 是一种基于图像中物体形状的处理方法&#xff0c;通常用于二值图像和灰度图像。它通过腐蚀、膨胀等基本操作&#xff0c;结合开运算、闭运算、梯度运算、顶帽、黑帽等派生操作&#xff0c;来实现去…

学习嵌入式第三十五天

文章目录网络&#xff08;续上&#xff09;1.函数接口2.相关功能实现1.TCP连接2.UDP习题网络&#xff08;续上&#xff09; 1.函数接口 sendto 原型&#xff1a;ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, sockle…

为什么给数据表加了索引,写入速度反而变慢了

为数据表增加索引后之所以会导致写入&#xff08;包括插入、更新、删除&#xff09;操作的速度变慢&#xff0c;其根本原因在于索引本质上是一个独立的、需要与主表数据保持实时同步的“数据结构”。这一机制的核心逻辑涵盖五个方面&#xff1a;因为索引本质上是一个“独立的数…

.NET Core 中采用独立数据库的SAAS(多租户)方法

介绍多租户是指一种软件架构&#xff0c;其中软件的单个实例在服务器上运行并为多个租户提供服务。在基于 SAAS 的平台中&#xff0c;租户是指使用该平台开展业务运营的客户。每个租户都拥有独立的数据、用户帐户和配置设置&#xff0c;并且与其他租户隔离。多租户允许有效利用…

运维日常工作100条

这是一份非常详细和实用的“运维日常工作100条”清单。它涵盖了从日常巡检、变更管理、故障处理到安全、优化和文档等运维工作的方方面面,可以作为运维工程师的日常工作指南和检查清单。 运维日常工作100条 一、日常巡检与监控 (20条) 检查核心监控大盘:查看整体业务健康状态…

OpenHarmony子系统介绍

OpenHarmony子系统OpenHarmony子系统1. AI业务子系统2. 方舟运行时子系统3. ArkUI框架子系统4. DFX子系统5. DeviceProfile子系统6. XTS子系统7. 上传下载子系统8. 主题框架子系统9. 事件通知子系统10. 位置服务子系统11. 元能力子系统12. 全局资源调度子系统13. 全球化子系统1…

博士招生 | 英国谢菲尔德大学 招收计算机博士

内容源自“图灵学术博研社”gongzhonghao学校简介谢菲尔德大学&#xff08;The University of Sheffield&#xff09;是英国久负盛名的公立研究型大学&#xff0c;也是罗素集团成员之一。在 2026 年 QS 世界大学排名中&#xff0c;谢菲尔德大学位列第92位&#xff0c;其中计算机…

如何理解面向过程和面向对象,举例说明一下?

面向过程和面向对象是两种不同的编程思想&#xff0c;核心区别在于解决问题的视角不同&#xff1a;前者关注 “步骤和过程”&#xff0c;后者关注 “对象和交互”。面向过程的核心思想是把问题拆解成一系列步骤&#xff0c;通过函数实现每个步骤&#xff0c;然后按顺序调用这些…

深入了解评估与微调中使用的Graders:原理、实现与最佳实践

深入了解评估与微调中使用的Graders 在模型评估与微调&#xff08;Fine-tuning&#xff09;过程中&#xff0c;Graders&#xff08;评分器&#xff09;是衡量模型输出与参考答案之间表现的重要工具。本文将系统介绍Grader的类型、技术实现及如何在实际项目中融入稳定且高质量的…

行缓存(line buffer)在图像卷积中的工作方式

上面这张图配合文字&#xff0c;展示了行缓存&#xff08;line buffer&#xff09;在图像卷积中的工作方式&#xff1a;上半部分是一个按行扫描输入的图像块&#xff08;示例为 99&#xff0c;编号 1–81&#xff09;。 蓝色表示已被写入行缓存并按队列等待的数据&#xff0c;绿…

【数据分享】中国371个城市的坡度矢量数据和excel数据

今天要说明数据就是中国371个城市的坡度矢量数据和excel数据。数据介绍在城市发展的进程中&#xff0c;地形地貌始终是影响规划决策的关键因素&#xff0c;而坡度作为表征地表倾斜程度的核心指标&#xff0c;更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个…