缺省函数,函数重载,引用简单介绍的补充说明

news2024/11/26 13:54:22

TIPS

  1. 命名空间域的作用实际上相当于把部分变量的名称给他隔离起来,这样的话就可以减少变量名的冲突。
  2. 命名空间是对全局域当中的这些变量啊,函数啊,类型啊进行一个封装与隔离,可以防止你和我之间的冲突,也可以防止与库之间的冲突。命名空间域他封装的是全局域当中的一些东西,而不是局部域当中,在局部当中也不存在命名冲突的问题。这个局部域实际上说白了也就是函数的作用域。命名空间域解决的是全局当中的冲突问题
  3. cin,cout在一般场景下会更为快捷,因为它是自动识别类型的。由于c++兼容c,所以在有些时候可以与printf与scanf结合起来混着用。

缺省参数补充

  1. 缺省参数也叫做默认参数
  2. 当在函数调用的时候没有给缺省参数传入具体的实参的时候,这个参数在函数里面就会用默认指定的缺省值。对于全缺省参数来说,这时候函数调用传参的方式可以有很多种,这个参数可以写全,也可以不写全,如果不写全的话就默认是从左往右依次给过去。
  3. 你提供的实参是从左到右提供到函数形参里面的,因此缺省参数要缺也必须是从右往左缺省(全缺省咱也就不说了)
  4. 当在函数调用的时候没有给缺省参数传入具体的实参的时候,这个参数在函数里面就会用默认指定的缺省值。对于全缺省参数来说,这时候函数调用传参的方式可以有很多种,这个参数可以写全,也可以不写全,如果不写全的话就默认是从左往右依次给过去。
  5. 对于半缺省参数来说,必须得从右往左去缺。对于半缺省来说,必须得至少穿一个实参。传入实参的时候实参是从左往右去给形参的
  6. 缺省参数的实际应用:比方说我现在已经定义了一个栈,然后当我假设需要去使用这个栈数据结构的时候,可能会面临两种场景。第一种场景就是说:我已经提前知道需要往栈当中插入100个数据;我也不知道到底需要插入多少个数据,基于此,因此在栈的初始化过程当中,对于malloc开辟的空间个数,就可以通过缺省参数来设置。
#include <iostream>
using namespace std;
typedef struct Stack
{
	int* p;
	int top;
	int capacity;
}Stack;
void StackInit(Stack* pst, int defaultcapacity = 4)
{
	pst->p = (int*)malloc(sizeof(int) * defaultcapacity);
	if (pst->p == NULL)
	{
		perror("malloc failed");
		return;
	}
	pst->top = 0;
	pst->capacity = defaultcapacity;
}
int main()
{
	Stack st;
	StackInit(&st);
	StackInit(&st, 100);
	return 0;
}
  1. 在一般大型项目当中,函数的声明与定义都是分开的,函数的声明是放在头文件当中,函数的定义是放在一个单独的.c文件当中。如果说这个函数有缺省参数的话,应该把这个缺省参数的缺省值给他写在函数的声明当中。如果说缺省参数的缺省值设定不写在声明当中的话就会报错。因为在预处理阶段就会把头文件打开,也就意味着函数的声明就会在main函数的上方,如果说在函数的声明当中没有去设定缺省值,那么在main函数里面如果说你函数传参的时候没有对缺省参数传参(按道理来说是完全合法的),但是在编译的时候编译器就会认为你这个函数传参没有传完整,因为你没有去给缺省值的话,他不知道这个参数是缺省参数,以为是必须得传参的(直接编译阶段语法报错),所以说在函数的声明当中必须得去给缺省值。对于函数的定义来说的话,就没必要去给缺省值了。

同作用域内函数重载的补充

  1. 重载:在自然语言当中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,也就是说该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
  2. 在c++当中允许同名函数的存在,但你只需要保证要么是参数的类型不同,要么是参数的个数不同,要么是参数类型的顺序不同。但是对返回值的话没有要求,比方说两个函数,它们的参数部分与函数名称全部都是一模一样的,但就是返回类型不一样。那这样这两个函数是不构成重载的。
  3. 因此对于出现多个函数名称相同的函数,你就根据函数名修饰的规则去判断一下这些函数到底构不构成函数重载。如果说这些函数构成函数重载,那肯定就是可以编译通过;如果说这些函数不能够构成函数重载,那么肯定是不能够编译通过的,会报错的,重定义
  4. 但有时候有更为特殊的情况,就是说当缺省参数参与进来的时候,有时候两个函数可以构成重载,但是调用的时候会存在歧义,调用不明确。
    在这里插入图片描述
  5. 所有的那些自动识别类型其实都跟函数重载有关,包括cin,cout等那些自动识别类型的玩意儿,还跟类和对象有关,以后再讲。

关于编译链接过程,函数重载底层原理的一些回顾与新补充

  1. 编译器在编译的时候早就没有.h了,因为头文件早在预处理的时候就已经全部被展开了,相当于就是一个拷贝与替换的过程。
  2. 但是预处理这个过程并不是在原先的.c文件上进行。因为如果那样去搞的话,相当于就把原先的给破坏掉了,可以理解成相当于新去创建了一个xxx.i文件,然后先把.c文件里面的代码全部拷贝到这个.i文件。然后再把头文件在.i里面给他全部展开。
  3. 然后预处理阶段完了之后就是编译阶段,编译阶段实际上有个非常非常重要的作用,就是检查语法,因为我现在需要把已经预处理好的代码给他转化成汇编代码。有语法问题的话我转化为汇编语言的时候就受阻了。这个过程非常非常的复杂,编译器工作当中最为核心的部分
  4. 汇编代码实际上就是指令级的代码,它的代码都是一个一个指令。
  5. 汇编阶段,由于这些汇编指令CPU是看不懂的,计算机只能看懂二进制指令,机器只识别二进制。汇编就是把汇编代码转化为机器码。
  6. 上面的这些过程,各个源文件都是不会发生交互,都是单独进行,最后生成一个又一个目标文件,然后进入链接阶段的时候,这些目标文件会全部合整起来,形成一个可执行程序。
  7. 然后先从预处理开始,现在进入到编译阶段,这时候进行语法检查,并把源代码给他转化成汇编指令,然后源代码当中的调用函数在汇编指令当中就是用call再加一个函数地址(因为函数本质上也就是一条又一条的汇编指令,函数中第一条汇编指令的地址=所谓的函数地址=第一条汇编指令其实就是压栈push ebp,因为需要去建立函数栈帧),这个call本质上就是一种跳转,也就是说跳转到后面跟着的那个地址所对应的汇编指令那边去。
    在这里插入图片描述
    在这里插入图片描述

去找函数的地址就是去通过符号表,然后对照着名字去找到地址的,所以说c++当中的函数名修饰的话,它会直接影响到符号表的形成,合并与重定位

  1. 其他具体内容细节看我C++博客前一节,这边只是新的认知与补充。

引用简单介绍的补充

  1. 引用主要是针对函数传参的时候的传址调用,就是不用再去通过传地址到参数里面,而是直接通过引用的方式直接空降到函数里面,达到相同的效果。
  2. 引用相当于就是说对同一块内存空间的一个变量名字,进行了多种取别名。它主要的优势在于有时候可以比指针的那些写法可读性更高,也更容易操作一些。尤其是在函数传参过程当中,通过引用可以将需要通过函数改动的东西不是通过传地址的方式而是引用的方式直接空降进来
  3. (内存里面的数据类型)& (外号别名) = 原先的名字or别名 注意:函数在传参的过程当中,定义形式形参与实参之间可以想象成划等号
  4. 对于指针的话,创建的时候可以不用明确的说指向谁,但是在引用的时候必须明确指出引用的实体
  5. (终身制)引用的话是不能够去改变指向的,比方说现在假设有一个变量是a,然后引用了一下,就是说把这个变量a取一个别名称为b,但是两者实际上都是同一个变量,都是同一个内存空间,然后现在比如说b等于是c,c为3,这时候不是说b已经改变了他引用的实体,引用是不能够去改变实体的,这边相当于就是说把变量a或者说b的值变成了3。a就是b,b就是a。
    在这里插入图片描述

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

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

相关文章

leetcode:各位相加(数学办法详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路 目录 题目&#xff1a; 代码实现&#xff1a; 大致思路&#xff1a; 题目&#xff1a; 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回…

【云原生Docker】11-Docker镜像仓库

【云原生|Docker】11-Docker Registry(官方仓库) 文章目录【云原生|Docker】11-Docker Registry(官方仓库)前言docker registry简介操作示例hyper/docker-registry-web前言 ​ 前面我们所有的docker操作&#xff0c;使用的镜像都是在docker官方的镜像仓库下载&#xff0c;当然这…

总结825

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 今日复习&#xff1a; 手绘高数第11讲思维导图&#xff0c;回顾线性代数第一讲 学习内容&#xff1a; 第12讲二重积分视频&#xff0c;纠正11讲…

手势控制的机器人手臂

将向你展示如何构建机械手臂并使用手势和计算机视觉来控制它。下面有一个在开发阶段的机械手臂的演示视频。展示开发中的手臂的演示视频&#xff1a;https://youtu.be/KwiwetZGv0s如图所示&#xff0c;该过程首先用摄像头捕捉我的手及其标志。通过跟踪特定的界标&#xff0c;例…

300到400的蓝牙耳机有哪些推荐?2023年值得入手的性价比蓝牙耳机

今年依旧是真无线蓝牙耳机快速发展的一年&#xff0c;市面上都有着各式各样的蓝牙耳机&#xff0c;一时间难以辨认哪些款式更适合自己&#xff0c;今天给大家介绍的是300元左右的蓝牙耳机&#xff0c;那这个价位的耳机到底怎么样呢&#xff1f;其实&#xff0c;300左右的蓝牙耳…

Qt 窗口置顶

文章目录一、前言二、示例代码三、补充说明四、窗口透明五、参考一、前言 我们使用QT进行界面开发时&#xff0c;可能会遇到需要将窗口置顶的情况。最常见的就是&#xff0c;需要制作一个悬浮工具栏&#xff0c;悬浮菜单&#xff0c;甚至是悬浮的画板。这就意味这我们需要将这个…

Javascript40行代码实现基础MVC原理。

参考文章 M数据层 V视图 C控制器 先来一个dom结构&#xff0c;一个p标签&#xff0c;用来展示输入的内容&#xff0c;一个input标签&#xff0c;用来输入内容⬇️ <p id"mvcp"></p> <input id"mvc"></input>创建Model类&#x…

第二部分——长难句——第一章——并列句

conjunction(and,but,if,when(while)) 想把两个句子&#xff08;多件事&#xff09;连在一块&#xff0c;就必须加上连词。 所以长难句到底是啥&#xff1f; 所以长难句&#xff08;直白表达&#xff0c;并不是语法表述&#xff09;就是几个简单句多家上几个连接词就齐活了&am…

一文读懂Profibus/Profinet/Ethernet的区别

Ethernet(以太网络)是大家很熟悉的一种网络了&#xff0c;由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范&#xff0c;是当今现有局域网采用的最通用的通信协议标准&#xff0c;包括标准的以太网&#xff08;10Mbit/s)、快速以太网&#xff08;100Mbit/s&a…

Python 自动化测试框架环境怎么搭建?这篇文章给你讲的明明白白

目录 Python 自动化测试框架环境搭建 第一步&#xff1a;安装 Python 第二步&#xff1a;安装 PyCharm 第三步&#xff1a;安装 Selenium WebDriver 第四步&#xff1a;安装浏览器驱动 第五步&#xff1a;创建测试用例 第六步&#xff1a;集成持续集成平台 总结 Python …

人工智能中的顶级期刊

本文描述了获取人工智能顶级期刊列表的方法&#xff0c;方便读者通过阅读顶级期刊中的论文跟踪人工智能前沿。同时&#xff0c;本文还介绍了获取人工智能顶级期刊投稿信息的方法&#xff0c;帮助读者提高论文的录用率。 1. 顶级期刊列表的获取方法 要查找某个领域的顶级期刊有…

RocketMQ 消费者Rebalance 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年4月15日 &#x…

gRPC 四种RPC类型异同

gRPC定义了如下四种RPC&#xff0c;刚开始接触的时候&#xff0c;感觉挺奇怪的&#xff0c;RPC不就是接口调用吗&#xff0c;区分这么多干啥&#xff1f;难道实现原理不一样&#xff1f;未读源码之前&#xff0c;还想着有啥神秘的地方&#xff0c;看完源码之后&#xff0c;才发…

Guns社区医疗项目

又是一年毕业季&#xff0c;计算机专业大四的同学们要接受毕业设计的考验啦。又有多少同学为了毕业设计而愁眉苦脸&#xff0c;心力憔悴。考虑到这些&#xff0c;这里为同学们分享一个适合你们毕业设计的作品以及详细介绍&#xff0c;让正在焦头烂额的同学们有所启发&#xff0…

MPC的560x系列的运行模式的介绍

一、模式简介 1、运行模式 一共11种模式&#xff0c;分别为RESET、DRUN、SAFE、TEST、RUN0、RUN1、RUN2、RUN3、HALT、STOP、STANDBY。其中RESET、DRUN、SAFE、TEST是系统工作模式&#xff0c;用户不用个特别关系&#xff0c;而后面几种是用于经常使用到的工作模式。 RESET&a…

ASP.NET Core - 依赖注入(二)

2&#xff0c;NET Core 依赖注入的基本用法 话接上篇&#xff0c;这一章介绍 .NET Core 框架自带的轻量级 Ioc 容器下服务使用的一些知识点&#xff0c;大家可以先看看上一篇文章 [ASP.NET Core - 依赖注入(一)] 2.3 服务解析 通过 IServiceCollection 注册了服务之后&#xf…

五一假期将近,给景区视频监控方案提几点建议

一、行业背景 随着旅游业的不断发展&#xff0c;旅游安全问题越来越受到重视。尤其是五一假期将近&#xff0c;为确保游客在景区内的人身安全和财产安全&#xff0c;景区必须采用高效、可靠的安防视频监控系统&#xff0c;并进行科学规划和设计&#xff0c;从而实现及时发现安…

Simulink simscape绳索和滑轮的使用总结

在做仿真的时候使用了绳索和滑轮&#xff0c;网上的资料不是很多&#xff0c;所以想想还是自己做一下记录&#xff0c;提供了一个小案例&#xff0c;文件上传到我的资源里了。 1.滑轮约束 Pulley 这个模块可以建立滑轮和绳索之间的约束。这个约束保证了绳子和滑轮之间 The pull…

Memory Analyzer Mat

目录 一、JDK 、JRE和JVM 的关系 二、Java进程内存占用查询命令 2.1JAVA 代码是如何执行的 2.2何时用hrpof文件分析内存 三、Memory Analyzer Mat 3.1Memory Analyzer Mat安装 3.2 Overview视图 3.2.1直方图视图&#xff08;histogram&#xff09; 3.2.2 Dominator Tr…

计算机图形学 Animation 学习笔记

1、做插值&#xff1a; 线性插值和用贝塞尔曲线做插值&#xff0c;贝塞尔曲线做插值可以看起来更生动形象 2、物理模拟&#xff08;Simulate Physics&#xff09; 原理是利用“ 力 质量 x 加速度”&#xff0c;知道了这些信息&#xff0c;那么下一帧的位置就可以提前被运算出来…