4 函数的升级-下

news2024/11/24 9:53:56

重载(overload)

同一个标识符在不同的上下文有不同的意义
如汉语中“洗”和不同的字搭配后,有不同的含义,play 和不同的单词搭配后有不同的含义。
函数重载:用同一个函数名定义不同的函数,通过不同的参数搭配来判断不同的函数
编译器通过不同的参数来区分不同的功能。

#include <stdio.h>
#include <string.h>

int func(int x) { //一个int 型参数
    return x;
};
int func(int a, int b) { //两个int型参数
    return a + b;
}
int func(char* s) { //一个char* 参数
    return strlen(s);
}

int main(int argc, char *argv[])
{
	int a, b, c;
	a = func(1);
	b = func(2, 3);
	c = func("abcdef");
	printf("a = %d, b = %d, c = %d\n", a, b, c);
    return 0;
}

函数重载至少满足下面的一个条件:
1.参数个数不同
2.参数类型不同
3.参数顺序不同

int func(int a, const char* s) {
    return a;
}
int func(const char* s, int a) {
    return strlen(s);
}
int main() {
    func(1, "abcdef");//会调用哪个?第一个
    func("abcdef", 1);//会调用第二个
    return 0;
}

当函数默认参数遇上函数重载会发生什么?会遇上二义性。

int func(int a, int b, int c = 0) {
    return a + b + c;
}
int func(int a, int b) {
    return a + b;
}
int main() {
    func(1, 2);//会调用哪一个?存在二义性,调用失败。
    return 0;
}

在这里插入图片描述
规则:当要用默认函数参数时,不要使用重载。当要使用重载时,不要使用函数默认参数。

C++编译器调用重载函数的准则

1.编译器会将所有同名函数作为候选者
2.尝试寻找可行的候选函数
2.1精确匹配实参(参数个数和类型)
2.2通过默认参数能够匹配实参
2.3通过默认类型转换匹配实参
3.匹配失败
3.1最终寻找到的可行候选函数不唯一、则出现二义性,编译失败。
3.2无法匹配所有候选者,函数未定义,编译失败。

重载函数的注意事项

  • 重载函数在本质上是相互独立的不同函数
  • 重载函数的函数类型是不同的
  • 函数返回值不能作为函数重载的依据,返回值不同不能作为重载函数。
    函数重载时由函数名和参数列表决定的。

函数重载与函数指针

下面程序哪个函数将被调用:

#include <stdio.h>
#include <string.h>
int func (int a) {
    return a;
}
int func(int a, int b) {
    return a + b;
}
int func(const char* s) {
    return strlen(s);
}
typedef int(*PFUNC)(int a);
//typedef void(*PFUNC)(int a); 无法匹配,编译报错。
int main(int argc, char *argv[])
{
	PFUNC p = func;
	p(1);//会调用哪个函数?
	printf("p(1) = %d\n", p(1));
    return 0;
}

当使用函数重载函数名对函数指针进行赋值时:

  • 根据重载规则挑选与函数指参数列表一致的候选者
  • 严格匹配候选者的函数类型与函数指针的函数类型
    依据上述规则,*typedef int(*PFUNC)(int a);*会去匹配第一个函数。

c++和c的相互调用

在项目中,融合c++和c代码是实际工程中不可避免的,虽然c++编译器能够兼容c语言的编译方式,但是c++编译器会优先使用c++的方式进行编译。利用extern关键字,可以强制让c++编译器对代码以c方式进行编译。
范例:C++调用C函数
C++使用C语言函数
范例:C调用C++函数
C调用C++函数

统一的解决方案
__cplusplus 是c++编译器内置的标准宏定义,可以让c代码既可以通过c编译器的编译,也可以在c++编译器中意c方式编译

#ifdef __cplusplus
extern "C" {
#endif
//函数声明
#ifdef __cpulsplus
}
#endif

注意,C++编译器不能以C的方式编译多个重载函数。C语言不允许重名函数,C语言没有重载函数概念。
下面代码会编译报错,报函数重名。

#ifdef __cplusplus
extern "C" {
#endif
void f() {
}
void f(int x) {
}
#ifdef __cplusplus
}
#endif

小结

  • 函数重载时C++相对于C语言的一个重要升级。
  • 函数重载通过函数参数列表区分不同的同名函数。
  • 函数的返回值类型不是函数重载的依据,即同名同参的函数,返回值不同,不是函数重载,会编译报错。
  • extern关键字能够实现C和C++相互调用。 C和C++并不对立,可以同时存在于项目中。

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

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

相关文章

SpringBoot整合RabbitMQ学习笔记

SpringBoot整合RabbitMQ学习笔记 以下三种类型的消息&#xff0c;生产者和消费者需各自启动一个服务&#xff0c;模拟生产者服务发送消息&#xff0c;消费者服务监听消息&#xff0c;分布式开发。 一 Fanout类型信息 . RabbitMQ创建交换机和队列 在RabbitMQ控制台&#xff0c;新…

飞书开发学习笔记(三)-利用python开发调试云文档和电子表格

飞书开发学习笔记(三)-利用python开发调试云文档和电子表格 一.建立Python飞书开发环境 首先还是进入开放平台下的API调试台 飞书开放平台&#xff1a;https://open.feishu.cn/app?langzh-CN 以获取"我的空间"下的文件清单为例&#xff0c;通过获取飞书API调试台提…

展开一个结构加法等式

4a6 4a8 - - - - - 1 - 1 - - - 1 - 1 - - 1 - - 1 - - 1 - - 1 - - - - 在5-1的方向上具体展开4a64a8 25 19 19 19 19 19 19 19 25 19 19 19 19 19 19 19 1 10 10 10 10 10 10 10 1 10 10 10 10 10 10 10 …

矩阵等价和向量组等价的一些问题

什么是向量组&#xff1f;答&#xff1a;向量组是由若干同维数的列向量&#xff08;或同维数的行向量&#xff09;组成的集合。什么是向量组等价&#xff1f;答&#xff1a;两个向量组&#xff0c;各自拼成矩阵A和B&#xff0c;向量组等价就是三秩相等&#xff0c;即r&#xff…

如何发布自己的golang库

如何发布自己的golang库 1、在 github/gitee 上创建一个 public 仓库&#xff0c;仓库名与 go 库名一致&#xff0c;然后将该仓库 clone 到本地。 本文这里使用 gitee。 $ git clone https://gitee.com/zsx242030/goutil.git2、进入项目文件夹&#xff0c;进行初始化。 $ go…

【unity实战】实现类似英雄联盟的buff系统

文章目录 先来看看最终效果前言开始BUFF系统加几个BUFF测试1. 逐层消失&#xff0c;升级不重置剩余时间的BUFF2. 一次性全部消失&#xff0c;升级重置剩余时间的BUFF3. 永久BUFF&#xff0c;类似被动BUFF4. 负面BUFF&#xff0c;根据当前BUFF等级计算每秒收到伤害值&#xff0c…

Docker Stack部署应用详解+Tomcat项目部署详细实战

Docker Stack 部署应用 概述 单机模式下&#xff0c;可以使用 Docker Compose 来编排多个服务。Docker Swarm 只能实现对单个服务的简单部署。而Docker Stack 只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。 stack是一组共享…

Pyhotn: Mac安装selenium没有chromedriver-114以上及chromedriver无法挪到/usr/bin目录下的问题

1.0 安装selenium 终端输入&#xff1a; pip install selenium 查看版本&#xff1a; pip show selenium2.0 安装chromedriver 查看chrome版本 网上大多数是&#xff0c;基本到114就停了。 https://registry.npmmirror.com/binary.html?pathchromedriver/ 各种搜索&#…

Blender基础操作:面操作细分、整体切分、挤出、内插、尖分、融并、切割、面的法向、填充等

目录 1. 面操作&#xff1a;进入‘面选择’模式&#xff0c;选择一个面 2. 面的挤出 3. 内插面 4. 尖分面 5. 面的切割 6. 面的法向normal 7. 填充面 8. X-Ray透视 1. 面操作&#xff1a; 进入“面选择”模式&#xff0c;选择一个面 4种操作手段&#xff1a; 菜单 工…

四、数据库系统

数据库系统&#xff08;Database System&#xff09;&#xff0c;是由数据库及其管理软件组成的系统。数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统&#xff0c;也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统&#xff0c;是存储介…

Redis01-缓存击穿、穿透和雪崩

目录 开场白-追命3连 使用场景 01缓存穿透场景与方案 02布隆过滤器 03缓存击穿场景与方案 04缓存雪崩场景与方案 开场白-追命3连 看你项目中有说用到Redis&#xff0c;都是哪些场景使用了Redis呢&#xff1f; 如果发生了缓存穿透、击穿、雪崩如何应对呢&#xff1f;缓存…

研读论文之Image Quality-aware Diagnosis via Meta-knowledge Co-embedding

研读论文之 Image Quality-aware Diagnosis via Meta-knowledge Co-embedding 前言一、简介二、主要内容2.1. 图像退化2.2. 图像质量感知诊断(IQAD)2.3. 元知识协同嵌入网络(MKCNet) 三、实现过程3.1. IQAD问题3.2. 元知识协同嵌入网络 (MKCNet)3.2.1功能3.2.2优化策略3.2.3 Ta…

轻信息服务展示预约小程序的内容是什么

预约几乎是适应所有经营商家的&#xff0c;可以提升客户服务/产品获取度、锁客及便捷性需求&#xff0c;同时也利于提升商家整体经营效率&#xff0c;无论获客还是留存线索都有很高帮助。 尤其对线下服务实体店来说&#xff0c;需要预约形式将客户引流到店&#xff0c;传统商家…

考研数学(数二)核心要点(极限)

前言 okey&#xff0c;今天难得有时间那就稍微整理一下数学部分的内容。注意&#xff0c;本文仅适用于考研冲刺阶段&#xff0c;对知识点进行复习使用。前提是你已经知道了相关知识点&#xff0c;我这里只是把我认为比较重要的&#xff0c;我自己总结的内容给出来&#xff0c;…

基于机器学习的学生成绩预测

学生成绩预测是一个基于回归问题的流行数据科学案例研究。对于数据科学初学者来说&#xff0c;这是一个很好的回归问题&#xff0c;因为它很容易解决和理解。本文中&#xff0c;将带你通过使用Python的机器学习来完成学生成绩预测的任务。 学生成绩预测&#xff08;案例研究&a…

本地idea远程调试服务器程序

本文主要介绍idea本地调试远程服务器程序的方式。相信很多同行跟我一样&#xff0c;在最初接触公司项目的时候&#xff0c;遇到测试提出的缺陷&#xff0c;往往会在本地进行调试、替换jar包远程调试等方式&#xff0c;本地调试往往会导致数据和环境不一致的问题使得问题无法复现…

机器学习领域经典书籍推荐

机器学习领域经典书籍 1. 数据挖掘概念与技术2. 机器学习3. 统计学习方法4. 深度学习5. 动手学深度学习&#xff08;PyTorch版&#xff09; 1. 数据挖掘概念与技术 原名: Data Mining&#xff1a;Concepts and Techniques&#xff0c;Third Edition 作者: &#xff08;美&#…

Solidity入门第一步之数据类型

各种类型介绍 数值类型(Value Type)&#xff1a;包括布尔型(bool)&#xff0c;整数型(int、uint、uint256)等等&#xff0c;这类变量赋值时候直接传递数值。引用类型(Reference Type)&#xff1a;包括数组和结构体&#xff0c;这类变量占空间大&#xff0c;赋值时候直接传递地…

Leetcode—707.设计链表【中等】

2023每日刷题&#xff08;十七&#xff09; Leetcode—707.设计链表 设计单链表实现代码 typedef struct Node {int val;struct Node* next; } MyLinkedList;MyLinkedList* myLinkedListCreate() {MyLinkedList* mList (MyLinkedList *)malloc(sizeof(MyLinkedList));mList-…

chroot

1.chroot技术 在Linux系统中&#xff0c;系统默认的目录结构都是以/&#xff0c;即根(root)开始的。而在使用chroot之后&#xff0c;进程的系统目录结构将以指定的位置作为根(/)位置。chroot实际作用就是将进程描述符中struct fs_struct中的root的值设置为选定的目录。 在经过…