day44——C++对C的扩充

八、C++对函数的扩充

8.1 函数重载(overload)

1> 概念

函数重载就是能够实现"一名多用",是实现泛型编程的一种

泛型编程:试图以不变的代码,来实现可变的功能

2> 引入背景

程序员在写函数时,可能会出现这种情况:定义多个函数时,仅仅只是因为函数参数的类型不同或者函数参数个数的不同,导致同一个功能的函数需要定义多个不同名字。例如:两个整数求和、两个小数求和、三个整数求和。。。这些都只是实现求和功能,由于参数个数或参数类型的不同,就需要定义多个函数名字,用起来比较麻烦。

基于以上背景,C+引入了函数重载:运行在同一个作用域下,定义多个同名的函数。但是,要求这些同名的函数必须参数参数不同,后期调用时,系统会根据主调函数的实参去自动匹配相应的函数执行。

3> 要求:

函数名相同

形参列表必须不同

返回值无关

必须在同一个作用域下

#include <iostream>using namespace std;//定义两个整数的求和
int sum(int m, int n)
{return m+n;
}//下面这个函数会报错,即使函数返回值和函数体内容不同,也不能构成重载
//void sum(int m, int n)
//{
//    return m-n;
//}//定义两个小数的求和
float sum(float m, float n)
{return  m+n;
}//定义两个double类型的数据求和
double sum(double m, double n)
{return m+n;
}//定义三个整数的求和
int sum(int m, double n, int k)
{return m+n+k;
}int main()
{cout<<sum(3,7)<<endl;        //10cout<<sum(3.5,7.5)<<endl;        //11cout<<sum(3,7.5, 6)<<endl;   //16return 0;
}练习:定义函数分别求两个整数的最大值,两个小数的最大值,三个整数的最大值,并验证
Plain Text
自动换行#include <iostream>using namespace std;
//定义两个整数的求和
void max(int m,int n)
{if(m>n){cout<< m <<"大" <<endl;}else{cout<< n <<"大" <<endl;}
}
//定义两个double小数的求和
void max(double m,double n)
{if(m>n){cout<< m <<"大" <<endl;}else{cout<< n <<"大" <<endl;}
}
void max(int m,int n,int k)
{if(m>n){if(m>k){cout<< m <<"大" <<endl;}else{cout<< k <<"大" <<endl;}}else{if(n>k){cout<< n <<"大" <<endl;}else{cout<< k <<"大" <<endl;}}
}
int main()
{max(3,7);max(1.12,2.22);max(1,2,3);max(1,3,3);return 0;
}

8.2 函数的默认参数

1> 引入目的:

程序员在定义函数时,可能会出现一个功能出现多个参数,但是,有时候,只需要传递其中某几个参数即可执行。此时,主调函数中传过来的参数,被调函数使用传过来的,主调函数没传过来的参数,被调函数使用自己的默认值

2> C++允许在定义函数时,给其中的某几个参数设置默认参数,对于设置了默认值的参数,主调函数传数据就使用主调函数传的,主调函数不传数据,就使用默认值

3> 默认参数的设置原则:靠右原则,也就是说必须当前参数的右边的形参设置了默认值后,当前参数才能设置默认值。

原因是,函数参数传递的过程是靠左原则,实参向形参传递时,向给左侧的形参赋值

4> 当函数重载和默认参数同时出现时,注意,如果带默认参数的函数包含了重载的函数,那么函数定义时没有问题,但是函数版调用时会不确定调用哪一个

5> 如果带默认参数的函数,声明和定义分开时,默认参数写在声明部分,定义部分就不写默认参数了

#include <iostream>using namespace std;int sum(int  = 0, int =0, int =100);    //函数声明//定义重载函数时
//int sum(int x, int y):如果有默认参数包含了该函数,函数定义是没有问题,但是函数调用时会不知道调用哪一个
int sum(int x, double y)
{return x+y;
}int main()
{cout << sum(2,3,5) << endl;       //调用了默认参数的函数,三个参数主调函数传递cout << sum(2,3) << endl;       //调用了默认参数的函数,前两个参数主调函数传递,后一个参数使用默认的cout << sum(2) << endl;       //调用了默认参数的函数,前一个参数主调函数传递,后两个参数使用默认的cout << sum() << endl;        //调用了默认参数的函数,三个参数使用的都是默认值return 0;
}//函数定义在被调函数后面
int sum(int m , int n, int k)
{return m+n+k;
}

8.3 哑元

1> C++定义函数时,支持哑元,运行某个形参或某几个形参只有声明,没有实际意义,唯一的作用就是起到占位作用

#include <iostream>using namespace std;//该函数中的参数2就是一个哑元,只起到占位作用,不让程序优化后报错
int sum(int m, int, int k)
{return m+k;
}int main()
{cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;return 0;
}

2> 使用场景1:当某个程序已经发布后,随着技术的升级,可能会对某些函数进行优化,将原本有多个参数的函数,只需要少了的参数就可以完成,但是此时,未优化前的函数已经被多次调用,修改起来不方便,此时就可以在定义函数时,将被优化掉的形参设置成哑元,只起到接受数据的作用,并不起实际作用

3> 使用场景3:后期学习自增自减运算符重载时,用于区分前置和后置

8.4 内联函数

1> C++支持内联函数,使用关键字inline在函数定义前使用

2> 作用:被设置成内联函数的函数,在编译时,编译器会建议将内联函数自动展开,无需在运行时为该函数开辟内存空间,提高程序的执行效率

3> 内联函数的设置要求:

1、函数体积要小

2、调用比较频繁的函数

3、递归函数不能设置成内联函数

4、不足:如果大量使用内联函数,会使得主程序体积膨胀

#include <iostream>using namespace std;//该函数中的参数2就是一个哑元,只起到占位作用,不让程序优化后报错
inline int sum(int m, int, int k)
{return m+k;
}int main()
{cout << sum(2,3,5) << endl;cout << sum(2,3,5) << endl;return 0;
}

4> 内联函数与带参宏的区别

在C++中,内联函数和带参宏虽然都可以用来在编译时展开代码以减少函数调用的开销,但它们之间存在几个关键的区别:
1. 类型检查
内联函数:内联函数是真正的函数,支持类型安全,会进行类型检查。
带参宏:宏只是预处理器的文本替换工具,不进行类型检查,容易引发类型相关的错误。
2. 编译器优化
内联函数:内联函数允许编译器进行更多优化,比如常量折叠、死代码消除等。
带参宏:宏展开后的代码通常不会受到这些优化的好处,因为它们在预处理阶段就已经被处理了。
3. 调试
内联函数:在调试时,内联函数可以像普通函数一样进行单步调试。
带参宏:宏在预处理阶段就已经被展开,这使得调试变得困难,因为它们在源代码中不再是独立的实体。
4. 作用域
内联函数:内联函数遵循正常的作用域规则。
带参宏:宏没有作用域的概念,它们可以在定义后的任何地方被展开,有时会导致意外的名字冲突。
5. 重复代码
内联函数:内联函数的代码在多个调用点展开时,编译器可以智能地处理,避免不必要的代码膨胀。
带参宏:宏每次使用时都会文本上的复制粘贴,可能会导致代码膨胀。

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

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

相关文章

k8s的组件以及安装

目录 概念 k8s的使用场景 k8s的特点 核心组件 master主组件 1.kube-apiserver 2.etcd 3.kube-controller-manager 控制器 4.kube-scheduler node从节点组件 1.kubelet 2.kube-proxy 3.docker 总结 k8s的核心概念 安装k8s 架构 安装步骤 实验&#xff1a;创…

Linux学习笔记(4)----Debian压力测试方法

使用命令行终端压力测试需要两个实用工具&#xff1a;s-tui和stress sudo apt install s-tui stress 安装完成后&#xff0c;在终端中启动 s-tui实用工具&#xff1a; s-tui 执行后如下图&#xff1a; 你可以使用鼠标或键盘箭头键浏览菜单&#xff0c;然后点击“压力选项(Str…

Leetcode Day14排序算法

动态git可以看 :https://leetcode.cn/problems/sort-an-array/solutions/179370/python-shi-xian-de-shi-da-jing-dian-pai-xu-suan-fa/ 选择排序 def selection_sort(nums):n len(nums)for i in range(n):for j in range(i, n):if nums[i] > nums[j]:nums[i], nums[j] …

甲基化组学全流程生信分析教程

甲基化组学全流程分析和可视化教程 读取数据目录下的idat文件的甲基化全流程一键分析 功能简介 甲基化分析模块可以实现甲基化芯片450K, 870kEPIC数据的自动读取&#xff0c;可以读取idat文件&#xff0c;也可以读取beta甲基化矩阵文件甲基化数据的缺失值插值甲基化数据的质…

python测试框架之Pytest

初识Pytest Pytest1.Pytest的特点&#xff1a;2.Pytest的基本使用规则3.pytest安装1&#xff09;使用编译器安装2&#xff09;使用命令安装 4.pytest规则 Pytest Pytest是python的一个第三方单元测试库&#xff0c;它的目的是让单元测试变得容易&#xff0c;并且也能扩展到支持…

解析云上实时数仓的挑战与实践 | Databend @DTCC 2024 演讲回顾

8 月 22 日 ~ 24 日&#xff0c;由 IT168 联合旗下 ITPUB、ChinaUnix 两大技术社区主办的第 15 届中国数据库技术大会&#xff08;DTCC2024&#xff09;在北京朗丽兹西山花园酒店成功召开。本次大会以“自研创新 数智未来”为主题&#xff0c;通过深度交流与探讨&#xff0c;推…

如何在手机上设置国内代理IP地址:详细指南

在某些情况下&#xff0c;我们可能需要在手机上设置国内代理IP地址&#xff0c;以便访问特定的网络服务或提高网络连接的稳定性。本文将详细介绍如何在Android和iOS设备上设置代理IP地址。 在Android设备上设置代理IP地址 在Android设备上设置代理IP地址非常简单&#xff0c;只…

MYSQL:简述对B树和B+树的认识

MySQL的索引使用B树结构。 1、B树 在说B树之前&#xff0c;先说说B树&#xff0c;B树是一个多路平衡查找树&#xff0c;相较于普通的二叉树&#xff0c;不会发生极度不平衡的状况&#xff0c;同时也是多路的。 B树的特点是&#xff1a;他会将数据也保存在非叶子节点。而这个…

C语言典型例题55

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 例题4.7 兔子的繁殖。这是一个有趣的古典问题&#xff1a;有一对兔子&#xff0c;从出生后的第3个月开始起每个月都生一对兔子。小兔子长到第3个月又生一对兔子。假设所有兔子都不死&#xff0c;…

二叉搜索树进阶之红黑树

前言&#xff1a; 在上文我们已经学习了AVL树的相关知识以及涉及的四种旋转的内容&#xff0c;但是AVL树追求平衡导致旋转操作过多&#xff0c;一些情况下影响性能&#xff0c;由此我们就来了解一下二叉搜索树的另外一个分支&#xff0c;红黑树。 &#xff08;倘若对旋转知识…

2024版Assimp配置教程

最近想看看图形学&#xff0c;选择速通LearnOpenGL&#xff0c;不出意外最耗时间的依然是配置环境。按照教程上的把GLFW等等配置的没有问题&#xff0c;但是在Assimp这里卡住了。原因是教程上说的不详细&#xff0c;而网上查的又和现在的版本相去甚远&#xff0c;导致捣鼓了好一…

从web.xml动态读取sunspringmvc.xml文件

文章目录 1.问题分析1.SunWebApplicationContext.java 中sunspringmvc.xml是写死的2.但是web.xml已经配置了init-param&#xff0c;所以应该是可以读取的 2.具体实现1.SunDispatcherServlet.java 得到ServletConfig传递给Spring容器完成初始化2.SunWebApplicationContext.java …

【C++从小白到大牛】C++的隐式和显示类型转换基础知识讲解

目录 1、C语言中的类型转换 2、C语言和C中可以相互转换的类型总结 C语言&#xff1a; CPP&#xff1a; 3. 为什么C需要四种类型转换 4、C四大强制类型转换 4.1static_cast 4.2 reinterpret_cast 4.3 const_cast 4.4dynamic_cast 注…

基于x86 平台opencv的图像采集和seetaface6的性别识别功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的性别识别功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的性别识别模块从而实现…

谓词和量词

一、个体词和谓词 命题是一句陈述句&#xff0c;命题由个体词和谓词组成。 个体词是句子中的主语部分&#xff0c;比如这里的王童。 谓词是句子里的剩余部分&#xff0c;比如是一个三好学生 个体词用小写字母表示&#xff0c;谓词用大写字母&#xff0b;&#xff08;&#…

数据库(专业存储数据)

数组、链表、变量----->内存&#xff1a;程序运行结束&#xff0c;数据丢失 文件-------------->硬盘 数据库&#xff1a;专业存储数据&#xff0c;大量数据----------->硬盘 一、数据库文件与普通文件区别: 1.普通文件对数据管理(增刪改查)效率低 2.数据库对数据…

算法: 双指针

题目&#xff1a;环形链表 题目讲解&#xff1a; 判断环 要判断链表是否有环&#xff0c;可以使用快慢指针的方法。快指针每次走两步&#xff0c;慢指针每次走一步。如果链表有环&#xff0c;快慢指针最终会相遇&#xff1b;如果没有环&#xff0c;快指针会先到达链表末尾。 …

MySQL:简述对事务的认识

浅谈对Spring事务的认识&#xff1a;https://xiaoer.blog.csdn.net/article/details/80849971 一、事务的特性 事务是数据库永恒不变的话题&#xff0c; ACID&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性&#xff0c;持久性。 &#xff08;1&#xff09;原子性&am…

基于麒麟信安操作系统的光伏发电功率预测系统完成大规模部署建设

麒麟信安操作系统&#xff0c;作为行业数智化建设的安全根基&#xff0c;为电力业务系统提供了稳定可靠的底层平台&#xff0c;在全球能源结构转型大潮中扮演着至关重要的角色。某光伏电站项目中&#xff0c;基于麒麟信安操作系统的光伏发电功率预测系统完成大规模部署建设&…

手机游玩植物大战僵尸杂交版V2.3.7最新版教程(文章末尾免费直接下载链接)

最新版植物大战僵尸杂交版V2.3.7手机游玩教程 【V2.3.7全面升级】植物大战僵尸杂交版&#xff1a;跨平台终极安装指南 - 苹果、安卓、电脑、电视兼容&#xff0c;界面革新&#xff0c;16卡槽扩展&#xff0c;高分辨率支持&#xff0c;BUG修复&#xff0c;畅享游戏乐趣 前言 …