C++ (第二天上午---函数重载和缺省参数和占位参数)

一、函数重载

1、问题的引入
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似:

void swap1(int *a, int *b);      //交换 int 变量的值
void swap2(float *a, float *b);  //交换 float 变量的值
void swap3(char *a, char *b);    //交换 char 变量的值
void swap4(bool *a, bool *b);    //交换 bool 变量的值

那么在C++中,有没有一种方法,允许多个函数拥有相同的名字,只要它们的参数列表不同就可以呢。
答案:使用函数重载。
2、概念
用相同的函数名定义多个不同的功能称为函数重载。重载的函数根据参数的个数和类型进行区分,但不能单独根据返回类型进行区分。
3、例子

void swap(int *a,int *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}
void swap(float *a,float *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}
void swap(char *a,char *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}
void swap(bool *a,bool *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}

在函数调用的时候会根据不同的参数列表选择调用对应的函数
4、函数重载的规则

  • 函数名称必须相同
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)
  • 函数的返回类型可以相同也可以不相同。
  • 仅仅返回类型不同不足以成为函数的重载
    5、函数重载的作用
  • 解决函数名字资源问题
  • 函数调用的时候很方便,自动根据不同的参数调用不同函数(静态多态-编译时候多态)
    6、注意
    在c++中编译器会检查函数名称和参数列表, 在c语言中编译器只检查函数名称
    7、函数重载原理
    在这里插入图片描述
    总结:返回值不一样不能实现函数重载
    const参数能实现函数重载

二、函数默认参数(缺省实参)和占位参数

1、概念
在声明函数的时候可以赋予函数参数默认值。所谓默认值就是在调用时,可以不写某些参数的值,编译器会自动把默认值传递给调用语句中。
2、特点

  • 如果函数的声明和定义是分开的,必须在声明的时候设置默认值,不可以在定义的时候设置默认值;
  • 不能将实际值传递给引用类型的参数。可以将变量作引用类型参数的默认值,这时变量必须是已经声明且是全局变量
#include<iostream>using namespace std;int g_val = 10;//默认值是在函数声明的时候进行设置
int func(int a=10);
//不能将实际值传递给引用类型的参数。可以将变量作引用类型参数的默认值,这时变量必须是已经声明且是全局变量 
//int rfunc(int &a=10); --除非 const int &a=10
int rfunc(int &a=g_val);int main()
{func();return 0;
}
//如果函数的定义和声明是分开的,那么函数定义的时候不能设置默认值,而是在声明的时候进行设置
int func(int a)
{cout<<"a:"<<a<<endl;
}
int rfunc(int &a)
{cout<<"a:"<<a<<endl;
}
  • 若给某一参数设置了默认值,那么在参数表中其后所有的参数都必须也设置默认值
如果多参数默认,必须满足从右往左连续默认
void fun(int a, int b=9, int c=1); 允许
void fun(int a=1, int b, int c=2); 不允许

3、占位参数
占位参数:跟默认参数不同,在函数定义时,形参只写类型,不写形参变量名
语法:

返回值类型  函数名(type ) //type --- int char
{}
占位参数的使用场景比较少,只在运算符重载中可以应用
void test(int) //占位参数
{}
void test1(char) //占位参数
{}
int main()
{int b = 10;test(b); //带占位参数的函数调用时,要传入对应类型的参数值return
}

练习5:使用链表设计一个录入学生信息的函数(参数为学生信息)(输入信息有个学号,姓名,年龄,班级 参数顺序自定),结合函数重载和默认参数的特点,设计的时候使后期使用更方便

#include <iostream>
#include <cstring>/* 练习2:设计一个录入学生信息的函数(参数就是学生信息)
(输入的时候有姓名、年龄、班级...),结合函数重载和默认参数的特点
设计出来的程序使用的时候 更加方便 */using namespace std;enum MODE
{ADD, //增加SHOW,    //显示EXIT    //退出
};struct student{char name[256];int age;char classes[256];//班级
};//单向非循环链表
typedef struct node{struct student info;//数据域struct node *next;//指针域
}Node_t;//链表的头结点
typedef struct list{Node_t *head;//数据的首结点Node_t *tail;//数据的尾结点int nodeNumber;//链表中结点的个数
}List_t;List_t *create_list()
{//1、申请一个头结点的内存空间List_t *list = new List_t;list->head = list->tail = NULL;list->nodeNumber = 0;return list;
}void insert_nodeToList_tail(List_t *list,const char *name,const int age=21,const char *classes="gz2166")
{if(list==NULL)return ;//1、新建数据结点Node_t *newNode = new Node_t;//2、初始化strcpy(newNode->info.name,name);newNode->info.age = age;strcpy(newNode->info.classes,classes);newNode->next = NULL;//3、将新建的结点插入到链表中if(list->head == NULL) //从无到有{list->head = newNode;list->tail = newNode;}else{ //从少到多  ---尾插法//当前尾结点的next指向新结点list->tail->next = newNode;//更新尾结点list->tail = newNode;}list->nodeNumber++;}void print_allToList(List_t *list)
{Node_t *p = list->head;cout<<"姓名\t\t"<<"年龄\t"<<"班级\t"<<endl;while(p){cout<<p->info.name<<"\t\t"<<p->info.age<<"\t"<<p->info.classes<<"\t\t"<<endl;p = p->next;}
}int main()
{List_t *list = create_list();insert_nodeToList_tail(list,"zhang3",22);insert_nodeToList_tail(list,"li4");insert_nodeToList_tail(list,"laowang",23,"gz2169");print_allToList(list);return 0;
}

四、函数重载与函数默认参数
思考:假如一个程序中有如下两个函数

void test()
{
}
void test(int x=10)
{
}
调用:
test(11);//调用 的是:void test(int x=10)
test();//调用的是???歧义

答案:有歧义,解决方法:可以定义命名空间

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

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

相关文章

Executors 提供了哪些创建线程池的方法?

java.util.concurrent.Executors 是一个工厂类&#xff0c;提供了一些静态方法来创建各种类型的线程池。这些方法简单易用&#xff0c;可以快速创建常见的线程池类型。以下是 Executors 提供的主要创建线程池的方法及其特性&#xff1a; 1. newFixedThreadPool(int nThreads) …

计算机系统基础(二)

1.数值数据的表示 为什么采用二进制&#xff1f; 二进制只有两种基本状态&#xff0c;两个物理器件就可以表示0和1二进制的编码、技术、运算规则都很简单0和1与逻辑命题的真假对应&#xff0c;方便通过逻辑门电路实现算术运算 数值数据表示的三要素 进位记数制&#xff08;十…

以太网常用协议——ARP协议

文章目录 一、 ARP协议与MAC层1.TCP/IP协议2. MAC地址3. ARP映射4. ARP请求和ARP应答 二、以太网帧格式三、ARP协议1. 以太网ARP通信测试&#xff1a; 以太网使用的协议很多&#xff0c;常用的有ARP、UDP等。 再介绍具体协议之前需要先知道一些基本的概念&#xff1a; 一、 AR…

COB显示屏与GOB显示屏封装方式有哪些不同?

很多用户因为使用场景的特殊性&#xff0c;所以会选择防护能力更强的COB显示屏或者是GOB显示屏&#xff0c;两种产品从名称上看只是有一个字母的悬殊&#xff0c;其实使用的工艺截然不同&#xff0c;GOB显示屏通常是在SMD显示屏的基础上进行升级&#xff0c;而COB显示屏则是完全…

独立开发者系列(15)——git的使用

上一篇14文章触发了敏感话题&#xff0c;直接未过审核&#xff0c;看来技术博客也有敏感点。 大部分情况下&#xff0c;独立项目是你一个人开发&#xff0c;但是当你接的项目比较大的时候&#xff0c;你需要其他人的帮忙&#xff0c;这个时候你要把代码分享给别人。因为如果你…

【分布式数据仓库Hive】Hive的安装配置及测试

目录 一、数据库MySQL安装 1. 检查操作系统是否有MySQL安装残留 2. 删除残留的MySQL安装&#xff08;使用yum&#xff09; 3. 安装MySQL依赖包、客户端和服务器 4. MySQL登录账户root设置密码&#xff0c;密码值自定义&#xff0c;这里是‘abc1234’ 5. 启动MySQL服务 6…

maven设置阿里云镜像源(加速)

一、settings.xml介绍 settings.xml是maven的全局配置文件&#xff0c;maven的配置文件存在三个地方 项目中的pom.xml&#xff0c;这个是pom.xml所在项目的局部配置文件用户配置&#xff1a;${user.home}/.m2/settings.xml全局配置&#xff1a;${M2_HOME}/conf/settings.xml 优…

YOLOV10训练集制作+Train+Val记录

代码地址&#xff1a;THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection (github.com) 一、数据制作 在这篇文章有讲过如何制作数据集及代码实现 YOLOV9训练集制作TrainVal记录_yolov9 train yaml-CSDN博客 二、配置文件 &#xff08;1&#xff09;代码结构…

“私域流量:解锁电商新机遇,共创数字化未来“

一、私域流量的战略意义再探 步入数字化浪潮的深处&#xff0c;流量已成为企业成长不可或缺的血液。与广泛但难以掌控的公域流量相比&#xff0c;私域流量以其独特的专属性和复用潜力&#xff0c;为企业铺设了通往深度用户关系的桥梁。它不仅赋能企业实现精准营销&#xff0c;…

国产跨平台高性能远程控制软件 RayLink,畅享高清流畅远程办公

不管是手机还是电脑&#xff0c;出色的硬件是好用的基础。而其中的软件工具&#xff0c;也是提高效率、减轻负担的好东西。 免费的软件工具众多&#xff0c;当然付费工具也不少。大家可能会觉得正版软件很贵&#xff0c;但国内软件代理商的价格其实很实惠。 本次为大家介绍一…

CF1375D Replace by MEX 题解

题目大意 令 m e x mex mex 为序列中最小的没有出现的数。 给你一个长度为 n n n 的序列 a a a&#xff0c;你可以进行不超过 2 n 2\times n 2n 次操作&#xff0c;使得序列 a a a 单调不降。每次操作你可以选定一个位置 p p p&#xff0c;并将 a p a_p ap​ 赋值为 …

一文看尽AI绘画工具 Stable Diffusion发展史,AI绘画究竟发展到什么地步了?!

01、引言 Stable Diffusion 在短短两年内发布了多个版本。最著名的版本是 1.5 和 SDXL。不过&#xff0c;还有许多其他版本值得一提。让我们一起来探索稳定扩散模型的起源和发展。 闲话少说&#xff0c;我们直接开始吧&#xff01; 02、缺失的SD V1.0版本 Stable Diffusion…

材质相关内容整理 -ThreeJs

在Three.js中&#xff0c;材质是用来定义3D对象外观的关键部分。Three.js支持多种材质文件和类型&#xff0c;每种材质都有其特定的用途和优势。下面简单整理了一下目前Three.js支持的材质文件和类型。 一、Three.js支持的材质文件类型 JPEG (.jpg) 和 PNG (.png) 用途&#x…

iphone新机官网验机流程

若您想购买新款iPhone并在官方网站上验证机器的真实性&#xff0c;可以按照以下流程进行&#xff1a; 打开苹果官方网站&#xff08;https://www.apple.com&#xff09;。在导航栏中选择“iPhone”选项&#xff0c;进入iPhone的产品页面。在页面中找到您想要购买的新款iPhone&…

C语言快速学习笔记

学习网站&#xff1a;C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com) 这个网站知识完整&#xff0c;讲解清晰。 在线C语言编程工具&#xff1a;菜鸟教程在线编辑器 (runoob.com) 国外学习网站&#xff1a;C语言介…

【机器学习】机器学习的重要方法——线性回归算法深度探索与未来展望

欢迎来到 破晓的历程博客 引言 在数据科学日益重要的今天&#xff0c;线性回归算法以其简单、直观和强大的预测能力&#xff0c;成为了众多领域中的基础工具。本文将详细介绍线性回归的基本概念、核心算法&#xff0c;并通过五个具体的使用示例来展示其应用&#xff0c;同时探…

使用conda创建虚拟环境,并将虚拟环境加载到jupyter notebook中【已解决】

使用conda创建虚拟环境&#xff0c;并将虚拟环境加载到jupyter notebook中【已解决】

免费分享:2000-2021年全国分省250mNDVI数据集(附下载方法)

NDVI (Normalized Difference Vegetation Index)归一化植被指数&#xff0c;又称标准化植被指数。是目前应用最广泛的植被指数&#xff0c;与植被的分布呈线性相关&#xff0c;是植被生长状态和空间分布的最佳指示因子&#xff0c;也是遥感估算植被覆盖度(FVC&#xff0c;Fract…

深入学习 Kafka(2)- Partition 和 Topic

1. Partition的作用 Topic是逻辑的概念&#xff0c;Partition是物理的概念&#xff1a; Partition 对一个 Topic 的消息进行物理上的分离&#xff0c;让消息可以分布在不同的实体机器上&#xff0c;可以提升系统吞吐量和并行处理能力。每个Partition可以有多个副本&#xff08…

交换机06_vlantrunk

一、虚拟局域网vlan 目的&#xff1a;划分广播域 思科设备如何去配置vlan 创建vlan设置对应的接口模式将接口加入vlan全局模式配置vlan vlan 2 设置接口模式&#xff08;目前需要将接口加入对应vlan&#xff0c;一般用于连接PC&#xff09; en conf t int f0/0 switchport m…