【初识C++】(缺省参数和函数重载)

news2024/12/26 23:07:33

文章目录

  • 一、缺省参数
    • 1.缺省参数定义
    • 2.缺省参数分类
      • 2.1全缺省参数
      • 2.2半缺省参数
  • 二、函数重载
    • 1.函数重载概念
    • 2.构成重载的几种方式
      • 为什么会有函数重载及其原理


一、缺省参数

1.缺省参数定义

缺省参数是在函数的声明中给定参数一个指定的值。
如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。
比如:

using namespace std;

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

int main()
{
	Func();		 // 没有传参时,使用参数的默认值

	Func(10);	 // 传参时,使用指定的实参

	return 0;
}

对于Func函数如果没有给定参数,那就按照默认的缺省值来赋值。如果给定了参数,那就按照给定的参数进行赋值。

2.缺省参数分类

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;
}

比如上面的函数参数就是全缺省参数。

2.2半缺省参数

半缺省参数是给定部分缺省值,不一定是给定一半。

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

注意:1.给定半缺省参数必须从右往左给!!!
注意:1.给定半缺省参数必须从右往左给!!!
注意:1.给定半缺省参数必须从右往左给!!!

比如:

void Func(int a =10, int b = 10, int c)
{
  cout<<"a = "<<a<<endl;
  cout<<"b = "<<b<<endl;
  cout<<"c = "<<c<<endl;
}

这样是错误的

也不能间隔着给,比如:

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

这样也是错误的。

注意:2.也不能在声明和定义中同时给定缺省值!!
注意:2.也不能在声明和定义中同时给定缺省值!!
注意:2.也不能在声明和定义中同时给定缺省值!!

二、函数重载

1.函数重载概念

函数重载是在同一作用域中具有几个功能相同且同名的函数,这些函数中具有不同的参数(包括参数类型,参数数量,参数位置)。

2.构成重载的几种方式

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;
}

这两个函数构成重载,因为两个函数同名,且它们的参数类型不同,上面的Add函数参数都是int类型,下面的Add函数参数是double类型。

2.2 参数个数不同构成重载

void fun()
{
	cout << "fun()" << endl;
}

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

这两个函数构成重载,因为函数名相同,并且第一个fun函数参数个数为0,第二个fun函数参数个数为int a,为1个。

2.3函数参数类型顺序不同

// 3、参数类型顺序不同
void fun(int a, char b)
{
	cout << "fun(int a,char b)" << endl;
}

void fun(char b, int a)
{
	cout << "fun(char b, int a)" << endl;
}

这两个函数构成重载,因为函数名相同,并且第一个fun函数的参数类型分别为 int ,char,但是第二个fun函数的参数类型分别为char,int。

注意:下面的两个函数不构成重载!

void fun(int a, int b)
{
	cout << "fun(int a,char b)" << endl;
}

void fun(int b, int a)
{
	cout << "fun(char b, int a)" << endl;
}

变量名与函数是否重载无关!

注意:
1.必须是相同的函数名
2.返回值不作为函数重载的条件。也就是返回值与函数是否重载无关。

比如:


int fun(int a)
{
	cout << "fun(int a)" << endl;
	return a+b;
}

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

int main()
{
	fun(1)
	fun(2)
}

假如要调用函数时,编译器就不知道该找哪个了。

为什么会有函数重载及其原理

对于C语言来说,是不支持函数重载的,C语言不允许出现两个同名的函数。

为了弥补这一缺陷,C++设计成可以使用同名函数来解决C语言的缺陷。

函数重载的原理:

我们知道.c文件生成.exe文件会分成几步:
1、 .c文件经过预处理器进行预处理生成 .i文件。

2、.i文件再经过编译器进行编译后,生成.s文件,该阶段会进行一些语法分析,词法分析,语义分析,符号汇总等操作。

3、.s文件再经过汇编器进行汇编操作后生成.o文件,该阶段会将代码翻译成汇编指令,再翻译成机器码。
在汇编阶段,会生成一张符号表,这张符号存储着被初始化了的全局变量,未被初始化的全局变量,变量名,变量的字节偏移量,函数名,还有地址等。

4、链接阶段,.o文件经过链接器的链接后,会生成.exe可执行程序。在这个阶段,链接器会将不同的.o文件的符号表等数据进行合并和重定位等。

**所以:函数名的地址是在汇编完成后生成的。**所以对于不同的函数名。比如:
在这里插入图片描述

在main.c文件对sum这个函数进行了声明,但是声明不会获得该函数的地址,而在sum.c文件中,经过了链接器的连接之后,将sum.o和main.o文件进行了符号表的合并,获取到了sum这个函数的地址,从而对该函数进行调用。

C++编译器中,对于同名的函数,在编译阶段,C++的编译器会对这两个同名的函数进行函数名修饰

不同的编译器对函数名的修饰规则不同,以Linux的gcc(c语言编译器)和g++(c++编译器)两个编译器为例。

gcc编译器对图中的函数的编译结果为右边:

在这里插入图片描述
g++编译器对图中的函数的编译结果为右边:
在这里插入图片描述

可以明显地看到,g++对函数做了修饰,编译后不再是原来的函数名了。

g++修饰规则:【_Z+函数长度+函数名+类型首字母】

在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。

通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三百左右蓝牙耳机选哪个?300左右无线蓝牙耳机推荐

多数人消遣的方式一般是听听音乐玩玩游戏&#xff0c;想要更好的体验感最少不了的一定就是蓝牙耳机了&#xff0c;可对于大多数人来说&#xff0c;irpods之类的属实太贵了&#xff0c;所以更多人追求性价比&#xff0c;之前也买过不靠谱的耳机&#xff0c;用几天就坏了&#xf…

MySQL数据库:索引

一、索引简介 1.概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 相当于是给数据库中的数据建立了一个目录&#xff0c;通过目录可以知道…

QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。

QT多线程5种用法第一种 主线程(GUI)第二种 子线程1继承自QThread头文件 movetothread4.h源文件 movetothread4.cpp子线程1对象的创建第二种 子线程2继承自QThread头文件源文件对象创建位置&#xff08;销毁&#xff09;第三种 子线程3继承自QThread头文件源文件对象的创建第四种…

基于matlab仿真机械手

一、前言该示例显示了处于主动立体视觉模式的操纵器。它说明了立体渲染属性的效果以及如何使用立体视觉 VRFIGURE 属性。仅当图形卡支持四缓冲 OpenGL 渲染并由图形卡驱动程序启用时&#xff0c;操纵器才会以活动立体视觉模式显示。请注意&#xff0c;只有当您使用带有主动快门…

Android 布局 Fragment

Android 布局 FragmentFragment出现的初衷生命周期onCreate()onPause()onAttach()onCreateView()onActivityCreated()onDestroyView()onDetach()您可能还想扩展几个子类&#xff0c;而非 Fragment 基类&#xff1a;DialogFragmentListFragmentPreferenceFragmentCompat同系列文…

2.3.2单链表的插入删除

按位序插入&#xff08;带头结点&#xff09; 将第i-1个结点的指针指向第i个结点。 头节点看作是第0个结点。 s->datae //设定s指针的数据域为e s->nextp->next //将p指针指向的位置赋值给s指针指向的位置 p->nexts //再将s的数据域赋值给p指针指向的位置…

浅析分布式理论的CAP

大家好&#xff0c;我是易安&#xff01; 今天让我们来聚焦于分布式系统架构中的重要理论——CAP理论。在分布式系统中&#xff0c;可用性和数据一致性是两个至关重要的因素&#xff0c;而CAP理论就是在这两者之间提供了一种权衡的原则&#xff0c;帮助我们在设计分布式系统时进…

MATLAB基于BP神经网络的光伏发电太阳辐照度预测(源码链接在文末)

光伏发电功率主要受太阳辐照度影响&#xff0c;所以准确预测太阳辐照度对光伏功率预测十分重要。程序采用小波分解先对辐照度数据进行分解&#xff0c;然后再用bp神经网络对分解的辐照度数据分别预测&#xff0c;再组合作为最后的预测结果。 人工神经网络(Artificial Neural …

研0进阶式学习---数据库1

目录Excel和数据库数据库的分类数据库的举例数据库基本结构数据库管理系统xampp、Navicat、MySQL基础知识与界面展示数据库基本连接步骤Excel和数据库 Excel和数据库都是用来存储数据的工具&#xff0c;但它们有以下区别和联系&#xff1a; 区别&#xff1a; 数据类型&#…

Java实现内网穿透

使用场景 1、当公司的一些系统功能使用了第三方服务时&#xff0c;通常第三方会回调我们的接口。在对接阶段&#xff0c;为了方便debug&#xff0c;我们肯定希望能回调到我们本地电脑上来。 2、当你在公司想访问部署在家里电脑的服务或者文件时。 3、当你的外地同事想访问你…

搭建nginx反向代理实现动静态分离

搭建nginx反向代理实现动静态分离一、实现高可用动静分离二 实验步骤2.1 安装nginx和开启路由转发2.2 实现lvs负载均衡2.3 实现动态网页功能2.4 实现nginx反向代理2.5 重启服务网页查看一、实现高可用动静分离 1、部署目的 ①用户访问业务时访问虚拟ip由lvs负责转发请求到业务…

LAMP及论坛搭建

1.编译安装apache 关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 systemctl stop firewalld.service setenforce 0[rootlocalhost opt]# lsapr-1.6.2.tar.gz apr-util-1.6.0.tar.gz httpd-2.4.29.tar.bz2安装环境依赖包 yum -y install gcc gcc-c make pc…

淘宝商品数据分析怎么操作?从哪些方面下手?

说起淘宝上面的商品可谓是成千上万&#xff0c;因此要是想对这些商品进行数据分析的话&#xff0c;也是需要一些技能的&#xff0c;并不是所有的数据都特别重要&#xff0c;我们需要学会选择比较重要的数据来进行分析。详细内容还请各位接着往下看! 一、根据淘宝指数分析以下相…

【JSP学习笔记】2.JSP 结构、生命周期及语法

前言 本章介绍JSP的结构、生命周期及语法。 JSP 结构 网络服务器需要一个 JSP 引擎&#xff0c;也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。本教程使用内嵌 JSP 容器的 Apache 来支持 JSP 开发。 JSP 容器与 Web 服务器协同合作&#xff0c;为JSP的正…

springboot读取yml文件中的list列表、数组、map集合和对象方法实例

目录前言application.yml定义list集合application.yml定义数组类型总结 前言 springboot配置文件yml类型简单的风格&#xff0c;十分受大家的欢迎&#xff0c;支持字符string类型&#xff0c;支持列表list类型&#xff0c;支持集合map类型&#xff0c;支持数组array类型&#x…

MySQL数据库 - 基础篇

本文文章基于黑马《MySQL》课程所做的笔记 1、基础篇 1.1、MySQL概述 数据库相关概念 名称全称简介数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Management System(DBMS)SQL操作关系型数据库的编程…

ijkplayer 编译增加支持更多的音视频格式

ijkplayer是B站开源的一款基于ffmpeg的移动端播放器。但为了减少播放器的体积&#xff0c;很多音视频的格式播放默认都是不支持的&#xff0c;需要自己下载ijkplayer源码进行编译。这里以mac环境下android为例&#xff0c;简述ijkplayer的编译过程&#xff0c;以及为了支持更多…

最新版本 Stable Diffusion 开源 AI 绘画工具之图生图进阶篇

✨ 目录&#x1f388; 图生图基本参数&#x1f388; 图生图&#xff08;img2img&#xff09;&#x1f388; 涂鸦绘制&#xff08;Sketch&#xff09;&#x1f388; 局部绘制&#xff08;Inpaint&#xff09;&#x1f388; 涂鸦蒙版&#xff08;Inpaint sketch&#xff09;&…

Adams2020软件安装教程

目录 一、软件简介 二、软件下载 三、软件安装 一、软件简介 Adams是一款多领域仿真软件&#xff0c;可以对机械、电子、流体、化学等系统进行建模、仿真和分析。Adams具有强大的动力学分析功能&#xff0c;可以模拟多种复杂系统的运动、力学、热力学和控制行为&#xff0c;包…

点云目标检测:open3d多窗口联动可视化

多个模型之间的对比除了指标之外,还需要可以直观的对比可视化结果,这次介绍一下如何使用open3d同时打开两个窗口分别加载两个模型的结果,同时实现两个窗口的联动,也就是当一个窗口拖动或者缩放时另外一个窗口也跟着做同样的变换。 点云可视化:使用open3d实现点云连续播放这…