【C++入门(3)】函数重载、引用

一、函数重载

1、函数重载概念

函数重载是指在同一作用域中,具有不同形参列表(参数的 个数 或 类型 或类型顺序 不同)的同名函数。

C语言中不允许同名函数的存在,如果一个程序中有两个函数的函数名完全相同,就会报错。而C++中是允许同名函数的存在的。比如下面这段代码,在C语言中编译不过去,在C++中则可以编译通过:

void Swap(int* pa, int* Pb)
{;
}void Swap(double* pa, double* pb)
{;
}

2、构成函数重载条件

(1)在同一作用域中

只有在同一作用域中的函数,才可以构成重载。

以下两个函数构成函数重载:

namespace test_1 {void Swap(int* pa, int* Pb){cout << "void Swap(int* pa, int* Pb)" << endl;}void Swap(double* pa, double* pb){cout << "void Swap(double* pa, double* pb)" << endl;}
}

以下两个函数不构成函数重载:

namespace test_1 {void Swap(int* pa, int* Pb){cout << "void Swap(int* pa, int* Pb)" << endl;}
}
namespace test_2 {void Swap(double* pa, double* pb){cout << "void Swap(double* pa, double* pb)" << endl;}
}

在下面这个例子中,两个Swap函数虽然不构成函数重载,但是也是可以同时存在于程序中的,因为他们在不同的命名空间中,使用它们时需要用域作用限定符指定命名空间,变相的使函数名有了区别。如果在这段程序中同时展开了test_1和test_2这两个命名空间,重名使用这两个函数,程序也会出错。但是此时错误原因不是非法的函数重载,而是命名空间引用不明确,属于调用歧义:

(2)参数个数不同

void Swap(int* pa)
{cout << "void Swap(int* pa)" << endl;
}
void Swap(int* pa, int* pb)
{cout << "void Swap(int* pa, int* pb)" << endl;
}

(3)参数类型不同

void Swap(int* pa, int* pb)
{cout << "void Swap(int* pa, int* pb)" << endl;
}
void Swap(double* pa, double* pb)
{cout << "void Swap(double* pa, double* pb)" << endl;
}

(4)参数类型顺序不同

void Swap(char* pa, int* pb)
{cout << "void Swap(char* pa, int* pb)" << endl;
}
void Swap(int* pa, char* pb)
{cout << "void Swap(int* pa, char* pb)" << endl;
}

3、不构成函数重载

(1)返回类型不同

返回类型不同时,函数不构成重载关系。因为没有返回值的函数不需要变量来接收返回值,而有返回值的函数虽然会返回一个值,但是也可以不使用变量去接收它,所以会导致混淆,系统无法区分究竟需要调用哪个函数。

void Swap(int* pa, int* pb)
{cout << "void Swap(int* pa, int* pb)" << endl;
}
int Swap(int* pa, int* pb)
{cout << "int Swap(int* pa, int* pb)" << endl;
}

(2)与缺省参数结合

下面例子中的func函数也不构成重载关系,原因同样是调用歧义。

void func()
{;
}void func(int a = 10)
{;
}int main()
{func();return 0;
}

二、引用

引用,就是给一个已存在的变量取一个“别名”。编译器不会为这个引用变量开辟新的空间,它和它引用的变量共用同一块内存空间。

int a;
int& b = a;
int& c = a;
int& d = b;

可以给同一个变量取多个别名,也可以给别名再取别名。

b和c就是变量a的别名,d是引用变量b的别名。b、c、d本质上都是a的别名,他们的地址都和a保持一致。

引用变量的类型是 int& ,本质还是原先的变量,所以可以运用到函数传参当中:

void func(int& m, int& n)
{int tmp = m;m = n;n = tmp;
}int main()
{int x = 1, y = 0;func(x, y);printf("%d %d\n", x, y);return 0;
}

可以看到函数成功交换了x和y变量的值。

我们知道普通的传值调用是不会改变实参的值的,因为形参是实参的一份临时拷贝,形参和实参分别在不同的内存空间上,所以对形参的改变,并不会影响到实参。而通过引用,给实参取别名的方式,可以让形参称为实参的别名,这样,由于形参和实参共用了同一块内存空间,形参也就是实参,所以对形参的修改,也就成了对实参的修改,进而实现了上面例子中,对x、y变量的交换。

别名的这个特点,就使它有了许多指针的色彩,在许多情况下,可以用取别名的方式,来代替指针。

引用在定义的时候必须初始化,并且一旦指定了被引用的变量,就不可以再更换。

第9行的含义是把b变量的值赋给x变量,也就是a变量,而不是给x重新指定被引用的变量。

我们知道,在C语言中,如果用const修饰一个变量后,这个变量是不可以被直接改变值的,而我们可以通过使用指针,来由地址间接的去修改这个变量的值。然而在C++中,我们可不可以使用这样的方法改变被const修饰的变量的值,也不可以通过给它取别名,来改变它的值。

int main()
{const int a = 1;int* pa = &a;return 0;
}

int main()
{const int a = 1;int& y = a;return 0;
}

int main()
{const int a = 1;const int& y = a;y = 1;return 0;
}

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

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

相关文章

轻松4步!格式工厂怎么转换mp3教会你

在数字化时代&#xff0c;音频文件格式转换变得越发重要&#xff0c;而格式工厂作为一款强大而多功能的工具&#xff0c;为我们提供了便捷的音频转换解决方案。特别是在将音频文件转换为MP3的需求上&#xff0c;格式工厂以其简便易用的特点备受欢迎。格式工厂怎么转换mp3&#…

坚持刷题|合并有序链表

文章目录 题目思考代码实现迭代递归 扩展实现k个有序链表合并方法一方法二 PriorityQueue基本操作Java示例注意事项 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;消失了一段时间&#xff0c;我又回来刷题啦&#xff0c;今天…

CMake从安装到精通

目录 引言 1. CMake的安装 2. CMake的原理 3. CMake入门 3.1 CMakeLists.txt与注释 3.2 版本指定与工程描述 3.3 生成可执行程序 3.4 定义变量与指定输出路径 3.5 指定C标准 3.6 搜索文件 3.7 包含头文件 4. CMake进阶 4.1 生成动静态库 4.2 链接动静态库 4.…

垃圾回收管理系统设计

一、引言 随着城市化进程的加快&#xff0c;垃圾处理问题日益凸显。为了有效管理垃圾回收&#xff0c;提高资源利用效率&#xff0c;降低环境污染&#xff0c;本文设计了一套垃圾回收管理系统。该系统涵盖了数据收集与分析、智能监测与识别、资源调配与协调、用户参与与反馈、…

Golang | Leetcode Golang题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; func maxPoints(points [][]int) (ans int) {n : len(points)if n < 2 {return n}for i, p : range points {if ans > n-i || ans > n/2 {break}cnt : map[int]int{}for _, q : range points[i1:] {x, y : p[0]-q[0], p[1]-q[1]if…

探索AI绘画工具的前沿:创新科技与艺术的无缝融合

在科技和艺术交织的时代&#xff0c;AI绘画工具以其独特的魅力引领着创作的新潮流。本文将带您深入了解AI绘画工具的前沿技术&#xff0c;并通过最新例子展示其实际应用和潜力。 AI绘画工具概述 AI绘画工具通过集成深度学习、自然语言处理等技术&#xff0c;实现了从文字描述…

关于从大平台跳转各个应用,更新应用前端包后,显示的仍是旧的内容,刷新应用页面后方才显示新的内容的问题的排查和解决

我们从绿洲物联平台跳转智能锁应用&#xff0c; 如下&#xff0c;我们可以看到&#xff0c;我们是通过a标签去跳转应用的。但是我们打开控制台的话&#xff0c;因为a标签是另外新开一个页面&#xff0c;我们看不到新页面的html文档的加载情况。 我们可以临时把_blank改成_sel…

Perl 语言入门学习

一、介绍 Perl 是一种高级的、动态的、解释型的通用编程语言&#xff0c;由Larry Wall于1987年开发。它是一种非常灵活和强大的语言&#xff0c;广泛用于文本处理、系统管理、网络编程、图形编程等领域。 Perl 语言的设计理念是“用一种简单的语法&#xff0c;去解决复杂的编…

Elixir学习笔记——Erlang 库

Elixir 提供了与 Erlang 库的出色互操作性。事实上&#xff0c;Elixir 不鼓励简单地包装 Erlang 库&#xff0c;而是直接与 Erlang 代码交互。在本节中&#xff0c;我们将介绍一些 Elixir 中没有的最常见和最有用的 Erlang 功能。 Erlang 模块的命名约定与 Elixir 不同&#x…

【C++高阶】掌握C++多态:探索代码的动态之美

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C继承 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀继承 &#x1f4d2;1. 多态的定义及实现&…

你好,Jetpack Compose

文章目录 为什么选 Jetpack Compose先决条件新建项目新建虚拟设备运行项目 为什么选 Jetpack Compose Jetpack Compose 是 Android 开发最新的、现代化的 UI 框架开发者几乎只需要使用 Kotlin 一门语言即可完成 App 开发&#xff08;Java 是基础&#xff0c;有些源码是 Java 写…

六西格玛助力便携式产品功耗大降:打造绿色节能新标杆!

随着功能的日益强大&#xff0c;便携式电子产品的功耗问题也日益凸显&#xff0c;成为制约产品性能提升和用户体验改善的关键因素。为了应对这一挑战&#xff0c;越来越多的企业开始探索应用六西格玛方法来降低便携式产品的功耗&#xff0c;实现绿色节能的目标。 六西格玛是一…

Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包

Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包 一、Gerber文件层叠与参数设置二、装配图文件设置导出三、光绘参数设置四、Gerber孔符图、钻孔表及钻孔文件输出五、输出Gerber文件六、输出IPC网表七、导出坐标文件八、文件打包 一、Gerber文件层叠与参数设置…

12. Django 第三方功能应用

12. 第三方功能应用 因为Django具有很强的可扩展性, 所以延伸了第三方功能应用. 通过本章的学习, 读者能够在网站开发过程中快速实现API接口开发, 验证码生成与使用, 站内搜索引擎, 第三方网站实现用户注册, 异步任务和定时任务, 即时通信等功能.12.1 Django Rest Framework框…

基于C++、MFC和Windows套接字实现的简单聊天室程序开发

一、一个简单的聊天室程序 该程序由服务器端和客户端两个项目组成&#xff0c;这两个项目均基于对话框的程序。服务器端项目负责管理客户端的上线、离线状态&#xff0c;以及转发客户端发送的信息。客户端项目则负责向服务器发送信息&#xff0c;并接收来自服务器的信息&#…

表 达式树

》》》可以借助 LINQPad工具 using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using System.Transactions;namespace EFDemo {public class…

C语言最终文章-二叉树

文章目录 前言二叉树的性质二叉树的存储方式顺序存储堆及其应用TopK问题堆排序 链式存储二叉树的练习1.二叉树查找值为x的节点2.判断是否为完全二叉树LC226.翻转二叉树[LC572. 另一棵树的子树](https://leetcode.cn/problems/subtree-of-another-tree/description/)两道选择题 …

单片机建立自己的库文件(4)

文章目录 前言一、新建自己的外设文件夹1.新建外设文件夹&#xff0c;做项目好项目文件管理2.将之前写的.c .h 文件添加到文件夹中 二、在软件中添加项目 .c文件2.1 编译工程保证没问题2. 修改项目列表下的名称 三、在软件项目中添加 .h文件路径四、实际使用测试总结 前言 提示…

Stable Diffusion文生图模型训练入门实战(完整代码)

Stable Diffusion 1.5&#xff08;SD1.5&#xff09;是由Stability AI在2022年8月22日开源的文生图模型&#xff0c;是SD最经典也是社区最活跃的模型之一。 以SD1.5作为预训练模型&#xff0c;在火影忍者数据集上微调一个火影风格的文生图模型&#xff08;非Lora方式&#xff…

创新实训2024.06.17日志:大模型微调总结

前段时间其实我们已经部署了大模型&#xff0c;并开放了对外的web接口。不过由于之前某几轮微调实验的大模型在对话时会有异常表现&#xff08;例如响应难以被理解&#xff09;&#xff0c;因此我在项目上线后&#xff0c;监控了数据库里存储的对话记录。确定了最近一段时间部署…