【C++初阶(二)】缺省参数函数重载

目录

前言

1. 缺省参数

 1.1 什么是缺省参数

 1.2 缺省参数的分类

     1.2.1 全缺省参数

 1.2.2 半缺省参数

2. 函数重载

 2.1 什么是函数重载

 2.2 缺省参数与函数重载

 2.3 函数重载的使用

 3. C++支持函数重载的原因

 总结


前言

        在学习C语言时我们就会发现,C语言中存在的许多规则使得C语言在使用时非常的不方便,例如在函数调用时必须要传参没有默认值,函数不可以重名等等问题,C++作为C的改进版,对C语言的缺陷进行了改进,同时也兼容C的语法。在C++中上述问题都得到了解决,也就是缺省参数和函数重载,接下来我将向大家详细介绍C++的缺省参数和函数重载。

a6c0473e16e249c2b9ca02e5b793f35e.gif#pic_center

1. 缺省参数

 1.1 什么是缺省参数

         缺省参数是指在函数定义时为参数提供默认值,使得在调用函数时可以选择性地省略该参数。当调用函数时省略了对应的参数,函数会使用默认值来代替。

 比如:

void Func(int a = 10)
{cout << "a = " << a << endl;}int main()
{Func();//没有传参时使用参数的默认值Func(2);//传参时使用的是指定参数return 0;
}

 1.2 缺省参数的分类

     1.2.1 全缺省参数

         函数的所有参数都设置了默认值,在调用函数时可以省略所有参数。比如:

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}int main()
{Func();return 0;
}

 1.2.2 半缺省参数

        半缺省参数是指在函数的部分参数设置了默认值,使得在调用函数时可以省略这些参数。比如:

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}int main()
{Func(1,2);return 0;
}

 使用注意

  •  缺省参数中,半缺省缺省值只能从右往左进行缺省,且必须是连续的

 比如:

int main()
{Func( ,1,2);//缺省位置从右向左,不可以中断return 0;
}
  •  缺省参数声明和定义不能同时给

 比如:

//定义 fun.c
void Func(int a = 10)
{cout << "a = " << a << endl;
}//声明 fun.h
void Func(int a = 2);

        声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定该用那个缺省值。应该在声明中给,如果只在定义中给,那么在其他文件调用时就无法达到缺省的效果。(函数声明是告诉编译器函数的存在,不在声明中写,那么在其他接口调用时,编译器就不会认为有默认值)。

  • 缺省值必须是常量或者全局变量
  •  C语言不支持

2. 函数重载

        自然语言中,一个词可以有多重含义(一词多义),人们可以通过上下文来判断该词真实的含义,相同的名称,却有不同的作用与意义。在C++中函数重载也是如此。

 2.1 什么是函数重载

         函数重载是指在同一个作用域内,可以定义多个同名函数,但这些函数的参数列表不同,调用时编译器会根据参数列表、来确定调用哪个同名函数。

 比如:

int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{Add(1, 1);Add(3.14, 3.62);return 0;
}

 定义两个同名的Add函数,在进行函数调用时,编译器会根据传递的参数来选择调用哪个函数。

 但如果一个传int类型,一个传double类型就会出现报错:

e35809768ec24e98be7f7d90cb2d5803.png

 传进去的参数与参数列表里的参数不匹配。

 2.2 缺省参数与函数重载

         有缺省参数也可以构成重载,但在使用时需要注意避免造成歧义。比如:

void fun()
{cout << "fun()" << endl;
}
void fun(int a = 0)
{cout << "fun(int a)" << endl;
}
void fun(int a)
{cout << "fun(int a)" << endl;
}

 aeb1641ff77b4487b8bc31ef89048c56.png

         在调用fun不传参时,fun()和fun(int a=0)都符合条件,这样就存在二义性,编译器在调用时不知道该调用哪一个。在结合使用时可以使用,但要避免类似这种二义性情况(尽量不要这样使用)。

 2.3 函数重载的使用

         函数重载可以依据参数类型不同而进行匹配,并选择调用函数,参数类型不同可分为:参数类型不同,参数个数不同,参数顺序不同。

//1.参数类型不同
int fun(int a)
{cout << "int fun(int a)" << endl;return a;
}
double fun(double b)
{cout << "double fun(double b)" << endl;return b;
}
// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void func(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void func(char b, int a)
{cout << "f(char b, int a)" << endl;
}

 这些都可以构成函数重载。

但要注意:

参数相同时,返回值不参与重载的规则

比如:

int f(int a)
{return 0;
}
double f(int a)
{return 2.1;
}

        如果两个函数的函数名相同、参数也相同,仅依靠返回值不同,是无法构成函数重载的(存在二义性)。

 3. C++支持函数重载的原因

     为什么C++支持函数重载而C语言不支持呢?

在 C/C++ 中,要运行一个程序,需要经过:编译和链接两大过程。

 详细可见:程序员进阶之路:程序环境和预处理

 程序大概执行流程:

cbaa91d744984f869b1f0d9dd81bc5dd.png

         C语言在编译阶段会产生一个符号表,在链接函数地址时,C语言通过符号表(函数名)去找。所以C语言不存在同名函数。

         C++在编译时会通过特殊修饰产生独特的字符(地址),通过地址寻找函数,以Linux环境下为例更为直观:

 Linux函数名修饰规则:

 _Z  函数名字符个数   函数名  参数首字母

 以 fun(int a,char b) ,fun(char b,int a) 为例,修饰后:_Z3funic、_Z3funci

 我们通过VS调试也可以看到,test.s文件如下:

186c765d2c2542dc9b8f5b3355e8e869.png

 不同的编译器有不同的修饰规则。这也就是C++为什么可以支持函数重载。


 总结

         缺省参数和函数重载是C++语言中非常有用的特性,它们可以帮助我们更好地组织和管理代码。在学习和使用这两个特性时,我们需要注意一些细节,以确保代码的正确性和可读性。以上便是本期的全部内容,希望对你有所帮助。最后感谢阅读!

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

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

相关文章

Flutter视图原理之三棵树的建立过程

目录 三棵树的关系树的构建过程1.updateChild函数&#xff08;element的复用&#xff09;2.inflateWidget函数3.mount函数3.1 componentElement的实现3.2 RenderObjectElement的实现3.2.1 attachRenderObject函数 4.performRebuild函数 总结三棵树创建流程 三棵树的关系 Flutt…

超声波清洗机靠谱吗?实用性比较高的超声波清洗机推荐

超声波清洗机是否靠谱&#xff0c;这是一个有争议的问题&#xff01;但是先不妨先来了解了解超声波清洗机。 超声波清洗机通过高频振动波来清洁物品表面&#xff0c;这些振动波会在水中形成微小的气泡。气泡不断崩裂&#xff0c;产生强大的冲击力&#xff0c;从而将物品表面的…

【ArcGIS微课1000例】0075:将AutoCAD(Dwg、Dxf)文件转换为shp、KML(kml、kmz)文件

文章目录 1. 加载DWG2. 导出为shp3. 投影变换4. 转为kml1. 加载DWG 打开ArcMap,点击添加符号: 选择地形图dwg数据,全选图层,也可以选择需要的图层。 提示位置的空间参考,点击确定即可。 加载效果。 2. 导出为shp 接下来我们演示将面状数据转为shp,选择Polygon图层,右键…

vue3+koa+axios实现前后端通信

vue3koaaxios实现前后端通信 写了一个小demo来实现前后端通信,涉及跨域问题&#xff0c;非常简单可以给大家平时开发的时候参考 服务端&#xff1a; 目录结构如下&#xff1a; router index.js // router的入口文件 // 引入路由 const Router require("koa-router&quo…

QT的QStringList的使用

初始 化 默认构造函数创建一个空列表。可以使用初始值设定项列表构造函数创建包含元素的列表&#xff1a; QStringList fonts { "Arial", "Helvetica", "Times" }; 添加字符串 可以使用insert 、append&#xff08;&#xff09; 和 operator…

armbian安装gcc、g++

文章目录 安装GCC安装G 安装GCC 打开终端&#xff0c;更新软件包列表&#xff1a; sudo apt update安装GCC&#xff1a; sudo apt install gcc如果需要安装特定版本的GCC&#xff0c;可以使用以下命令&#xff1a; sudo apt install gcc-<version> # sudo apt install g…

phpstudy_2016-2018_rce_backdoor 漏洞复现

phpstudy_2016-2018_rce_backdoor 漏洞复现 Remote Command Execute 打开 bp 打开代理浏览器 访问 php 页面 回到 bp 查看 http 历史&#xff0c;找到刚刚访问的 php 页面 发送到 Repeater 转到 Repeater php 页面请求内容加 Accept-Charset: 修改 Accept-Encodi…

Leetcode 142 环形链表II(链表:快2慢1指针相遇即有环)

Leetcode 142 环形链表II&#xff08;链表&#xff1a;快2慢1指针相遇即有环&#xff09; 解法1 https://leetcode.cn/problems/linked-list-cycle-ii/description/ 解法1 &#x1f534;1.【有无环】快慢指针&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xf…

3、Flowable任务分配和流程变量

任务分配和流程变量 1.任务分配 1.1 固定分配 固定分配就是我们前面介绍的&#xff0c;在绘制流程图或者直接在流程文件中通过Assignee来指定的方式 1.2 表达式分配 Flowable使用UEL进行表达式解析。UEL代表Unified Expression Language&#xff0c;是EE6规范的一部分.Flo…

K-Means算法

c^(i)&#xff1a;xi分配到第i个簇 μ&#xff1a;质心 μci&#xff1a;即第xi个样本分配到的簇的质心 Step 1.从样本中随机选取K个点作为簇质心 2.每个点都指向离它最近的簇质心 3.遍历结束后&#xff0c;重新计算K值&#xff0c;即计算K个簇的平均值作为新的质心 重复23直…

MATLAB中ss2tf函数用法

目录 语法 说明 示例 质点-弹簧系统 双体振荡器 ss2tf函数的功能是将状态空间表示形式转换为传递函数。 语法 [b,a] ss2tf(A,B,C,D) [b,a] ss2tf(A,B,C,D,ni) 说明 [b,a] ss2tf(A,B,C,D) 将方程组的状态空间表示形式转换为等同的传递函数。ss2tf 返回连续时间方程组…

lark 发送图片消息

1. 需求 2. 实现 2.1 获取数据源 # -*- coding: utf-8 -*- import os import json import requests import pandas as pd from pathlib import PurePath, Path import plotly.express as px from requests_toolbelt import MultipartEncoderdef get_data():dt [2023-10-01, …

为什么嵌入通常优于TF-IDF:探索NLP的力量

塔曼纳 一、说明 自然语言处理&#xff08;NLP&#xff09;是计算机科学的一个领域&#xff0c;涉及人类语言的处理和分析。它用于各种应用程序&#xff0c;例如聊天机器人、情绪分析、语音识别等。NLP 中的重要任务之一是文本分类&#xff0c;我们根据文本的内容将文本分类为不…

基于VCO的OTA稳定性分析的零交叉时差模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python 网络爬虫

爬虫原理 计算机一次Request请求和服务器端的Response回应&#xff0c;即实现了网络连接。 爬虫需要做两件事&#xff1a;模拟计算机对服务器发起Request请求。 接受服务器的Response内容并解析、提取所需的信息。 多页面爬虫流程 ​​​​​​​多页面网页爬虫流程

网络安全是什么?一文认识网络安全

一、网络安全 1.概念 网络安全从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xff0c;系统可靠正常地运行&#xff0c;网络服务不中断。 &#xff08;1&#xff09;基本特征 网络安全根据其本质的界定&#…

RK3588开发笔记(二):基于方案商提供sdk搭建引入mpp和sdk的宿主机交叉编译Qt5.12.10环境

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133915614 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Nginx的代理和负载均衡

一、nginx的代理方式 1.1 七层代理 七层代理&#xff1a;基于http协议&#xff0c;对请求的内容进行处理&#xff0c;然后转发到后端服务器 七层代理是客户端请求代理服务器&#xff0c;由代理服务器转发客户端的http请求&#xff0c;转发到内部的服务器进行处理(服务器可以是…

神经网络中的反向传播:综合指南

塔曼纳 一、说明 反向传播是人工神经网络 &#xff08;ANN&#xff09; 中用于训练深度学习模型的流行算法。它是一种监督学习技术&#xff0c;用于调整网络中神经元的权重&#xff0c;以最小化预测输出和实际输出之间的误差。 在神经网络中&#xff0c;反向传播是计算损失函数…

7.继承与多态 对象村的优质生活

7.1 民法亲属篇&#xff1a;继承&#xff08;inheritance&#xff09; 了解继承 在设计继承时&#xff0c;你会把共同的程序代码放在某个类中&#xff0c;然后告诉其他的类说此类是它们的父类。当某个类继承另一个类的时候&#xff0c;也就是子类继承自父类。以Java的方式说&…