C++第二节入门 - 缺省参数和函数重载

news2024/9/20 6:08:19

一、缺省参数

1、概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。

在调用该函数的时候,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参!

#include<iostream>
using namespace std;

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

2、 缺省参数分类 

全缺省参数(给所有的参数指定一个值)

#include<iostream>
using namespace std;

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl<< endl;
}
int main()
{
	Func();
	Func(1);
	Func(1,2);
	Func(1, 2, 3);
	return 0;
}
  • 缺省参数的值从左到右依次赋予!
  • 传参是从左往右依次传参!
  • 中间不能隔着给值

应用示例:

struct Stack
{
	int* a;
	int top;
	int capacity;
};

void StackInit(struct Stack* pst, int defaultCapacity = 4)
{
	pst->a = (int*)malloc(sizeof(int) * defaultCapacity);
	if (pst->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	pst->top = 0;
	pst->capacity = defaultCapacity;
}

int main()
{
	struct Stack pst;
	StackInit(&pst,100);
	return 0;
}

通过缺省参数我们可以默认给栈的初始化赋值为4,如果这个栈过大,存放的数据过多,会一直不断扩容造成效率低下,因此可以使用缺省参数的形式避免这种情况!

注意点:缺省参数不能在函数声明和定义中同时出现(且只能在函数的)

Stack.h文件

 Stack.c文件

Test.c文件 

C++在编译的时候将头文件展开,头文件里面只有函数的声明,没有函数的定义,在链接的时候两个函数才链接在一起,才有了函数的定义!

因此缺省参数不能在函数的定义和声明中同时出现,且只能在函数的声明中出现。否则编译的时候就报错了!

定义的时候不关心是不是缺省参数,因为总有两个参数传递过来,反而当有了声明的时候,在调用的时候如果只有一个参数,可以将其转化为两个参数!

二、函数重载

​函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 
些同名函数的形参列表( 参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 
不同的问题。 (对返回值没有要求!)

函数名相同,参数相同,返回值不同,不构成重载!(编译不通过!)

#include<iostream>
using namespace std;
// 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;
}
// 2、参数个数不同
void f()
{
 cout << "f()" << endl;
}
void f(int a)
{
 cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
 cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
}
int main()
{
 Add(10, 20);
 Add(10.1, 20.2);
 f();
 f(10);
 f(10, 'a');
 f('a', 10);
 return 0;
}

参数名不同不能构成重载!

特殊情况:

使用缺省参数能构成函数重载,但是,在执行f()的时候会出现歧义!不知道执行那一个!

注意点:自动识别类型本质上就是函数重载!

在链接的时候两个可执行程序才会交互在一起!

当我们在调用函数的时候,对应的汇编代码本质上是:call+对应的地址

call函数之后会跳到一个jump指令中去,(call是一个跳转指令,jump也是一个跳转指令!)

在编译阶段能否拿到函数的地址?

不能!编译阶段文件中只有函数的声明,没有函数的定义,在最后的链接的过程中才能在符号表中找到函数的地址,从而实现链接! 

只有声明可以过(可以进行接下来的操作)-> 声明是一种承诺(可以在接下来的链接过程中找到对应的地址!)

链接:找到定义(兑现承诺)

在链接的过程中,符号表存放了函数的地址:

C语言中符号表的名字和汇编代码中调用的函数名直接就是函数的名字!因此,编译的时候就出错了!

gcc可能兼容c++;

objdump -S 可执行程序名

可以查看对应可执行程序的汇编代码

在Linux环境下我们可以查看生成的可执行程序的汇编代码:

我们发现汇编代码对应的函数名就是函数本身的函数名!

假设我们当前的C++程序如下所示:(有两个函数重载)

解下来查看对应的汇编的函数的代码:

  • _Z是C++的规定;
  • 4代表函数名func为4个字符; 
  • id表示int和double两个参数的类型

 

  • _Z9是因为StackPush为9个字符;
  • P为指针类型;
  • 5是因为Stack为5个字符,Stack类型的指针;
  • 类型一个为i,一个为d ;

因此,C++对应的汇编代码的函数名和符号表中的函数名应该如下黑色:

疑问: 

是不是所有的函数都需要进行链接?

不是!如果一个函数的实现就位于test.cpp文件中,此时链接不需要在到其他的二进制代码文件中进行链接!

函数名修饰规则带入返回值,返回值不能能否构成重载? 

不能!编译时期就会爆粗!(不知道要调用哪个函数,分不清头文件对应的函数的声明)

例如Func,此时会发生调用歧义,不知道调用的是哪个类型的函数!

如果规定返回值,此时相当于自己创造了一门语言!

符号表在链接阶段才会生成!

上述命名规则是在gcc/g++的使用规则,而在Windows情况下会有不一样的命名规则:

三、引用

java只有引用,没有指针!

取地址而言,都是用的同一块空间!

且b++和d++同时也会对a进行改变!

int& d;

上面这种写法是错误的,引用必须给出别名!

注意点:

这里是赋值,引用的指向不能发生改变!

引用的应用:例如交换两个数字的值:

a是x的别名;b是y的别名;

a和b的交换就是x和y的交换!

如果改变int需要用int*,如果改变int*需要用int**!

同理,我们也可以对指针进行引用,交换a和b指针实际上就是交换px和py!

链表使用引用:

上面的*PLTNode实际上就是struct ListNode*   !

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

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

相关文章

2024 水博会,国信华源登场,数智创新助力水利高质量发展

9月4日-6日&#xff0c;由中国水利学会和中国水利工程协会共同主办的2024中国水博览会暨第十九届中国&#xff08;国际&#xff09;水务创新技术交流会在重庆国际博览中心召开。 本次水博会以“展水利前沿新技术 览新质生产力场景”为主题&#xff0c;国信华源携最新智能监测预…

【佳学基因检测】如何升级一个不再维护的软件包中的PHP代码?

如何升级一个不再维护的软件包中的PHP代码&#xff1f; 为什么要升级一个不再维护但是仍在使用的软件包中的PHP代码&#xff1f; 升级一个不再维护但仍在使用的软件包中的 PHP 代码是一个复杂但重要的过程。虽然这些软件包可能已经不再活跃地维护或更新&#xff0c;但升级其代…

通信工程学习:什么是ATM异步转移模式

ATM&#xff1a;异步转移模式 ATM&#xff1a;Asynchronous Transfer Mode&#xff08;异步转移模式&#xff09;是一种先进的通信技术&#xff0c;它采用固定长度的信元&#xff08;Cell&#xff09;作为信息传输、复用、交换及处理的基本单位&#xff0c;并通过异步时分复用的…

挖矿木马-Linux

目录 介绍步骤 介绍 1、挖矿木马靶机中切换至root用户执行/root目录下的start.sh和attack.sh 2、题目服务器中包含两个应用场景&#xff0c;redis服务和hpMyAdmin服务&#xff0c;黑客分别通过两场景进行入侵&#xff0c;入侵与后续利用线路路如下&#xff1a; redis服务&…

Tomcat Request Cookie 丢失问题

优质博文&#xff1a;IT-BLOG-CN 一、问题描述 生产环境偶尔(涉及到多线程处理)出现"前端传递Cookie为空"的告警&#xff0c;导致前端请求丢失&#xff0c;出现请求失败问题。告警内容如下 前端传递Cookie为空 告警内容&#xff1a;服务端获取request Cookie为空&…

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席20…

每日一练:螺旋矩阵

一、题目要求 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;ma…

Java | Leetcode Java题解之第396题旋转函数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxRotateFunction(int[] nums) {int f 0, n nums.length, numSum Arrays.stream(nums).sum();for (int i 0; i < n; i) {f i * nums[i];}int res f;for (int i n - 1; i > 0; i--) {f numSum - …

NISP 一级 | 3.1 网络基础知识

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;Internet 和 TCP/IP 协议 因特网&#xff08;Internet&#xff09;通过 TCP/IP 协议将遍布在全世界各地的计算机互联&#xff0c;从而形成超级计算机网络。因特网为用户提供了非…

【50 Pandas+Pyecharts | 暑期档电影票房数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 提取电影名称 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 电影总票房排行3.2 各电影票房占比3.3 2023中国各省地区大学数量分布3.4 《抓…

浅谈产线工控安全,产线工控安全的有效方案

随着工业4.0的发展&#xff0c;产线日益智能化&#xff0c;生产网已经发展成一个组网的计算机环境&#xff0c;虽然都进行了隔离&#xff0c;但仍需和外部进行数据交互&#xff0c;导致有病毒入侵可能。 产线工控安全事件不断 深信达MCK主机加固方案&#xff0c;针对产线工控…

工业无人机性能参数特点!!!

一、基本性能参数 动力系统&#xff1a;工业无人机多采用电动或油动动力系统&#xff0c;以提供足够的推力和续航能力。电动无人机通常具有较低的噪音和振动&#xff0c;适合城市或近距离作业&#xff1b;而油动无人机则具有更长的续航时间和更大的载重能力&#xff0c;适合远…

安科瑞Acrel-1000DP分布式光伏监控系统平台的设计与应用-安科瑞 蒋静

针对用户新能源接入后存在安全隐患、缺少有效监控、发电效率无法保证、收益计算困难、运行维护效率低等通点&#xff0c;提出的Acrel-1000DP分布式光伏监控系统平台&#xff0c;对整个用户电站全面监控&#xff0c;为用户实现降低能源使用成本、减轻变压器负载、余电上网&#…

MySQL基础作业三

查询 1.分别查询student表和score表的所有记录 mysql> select *from student; ---------------------------------------------------- | id | name | sex | birth | department | address | ---------------------------------------------------- | 901 | 张三丰…

大模型×认知科学:多维潜空间洞悉复杂认知

最近的一篇来自于Cognitive Sciences的精炼综述带给了我一些对于当下AI的某种反向思考&#x1f914;&#xff0c;分享给大家&#xff1a; 这篇综述讨论了如何通过多种降维技术揭示认知科学中的潜在表征空间&#xff0c;并探讨了选择适合研究目标的嵌入算法时需要考虑的关键因素…

每日一题,力扣leetcode Hot100之206反转链表

原来的链表是1-2-3-4-5-null 反转后是5-4-3-2-1-null 只需要循环遍历&#xff0c;并且借一个temp便可以完成反转 class Solution:def reverseList(self, head: ListNode) -> ListNode:cur, pre head, Nonewhile cur:tmp cur.next # 暂存后继节点 cur.nextcur.next pre…

AndroidStudio清除重置Http Proxy代理的方式

问题背景 在国内做代码开发的都知道&#xff0c;在国际互联网我们存在看不见的墙&#xff0c;导致无法访问一些代码库和资源&#xff0c;所以在使用开发工具拉取第三方库的时候总会遇到无法连接或者连接超时的情况&#xff0c;所以就会使用一些安全的网络代理工具&#xff0c;辅…

[项目][WebServer][项目介绍及知识铺垫][上]详细讲解

目录 1.何为WWW?2.HTTP分层1.整体2.细节3.DNS?4.协议之间是如何协同运作的&#xff1f; 3.Http相关概念1.特点2.URI && URL && URN3.HTTP URL格式 1.何为WWW? WWW是环球信息网的缩写&#xff0c;常简称为Web分为Web客户端和Web服务器程序&#xff0c;WWW可…

基于微信小程序点餐、外卖系统的设计与实现 (源码+lw+参考文档+核心代码讲解等)

基于微信小程序点餐、外卖系统的设计与实现(源码lw部署文档讲解等) 项目概述&#xff1a; 这段时间做了一个关于点餐的小程序&#xff0c;也是学习和总结的一部分&#xff0c;希望对大家有所帮助。本课题的主要目标是设计并能够实现一个基于微信小程序点餐系统。项目采用的是…

视频监控管理平台LntonAIServer视频智能分析抖动检测算法应用场景

在视频监控系统中&#xff0c;视频画面的稳定性对于确保监控效果至关重要。抖动现象是指视频画面中存在不稳定或频繁晃动的情况&#xff0c;这可能会影响视频的清晰度和可读性。LntonAIServer通过引入抖动检测功能&#xff0c;帮助用户及时发现并解决视频流中的抖动问题&#x…