【C++笔记】C++启航之为C语言填坑的语法

news2024/11/24 16:30:18

【C++笔记】C++启航之为C语言填坑的语法

  • 一、命名空间
    • 1、为什么要引入命名空间?
    • 2、命名空间的基本用法
    • 3、展开命名空间
    • 4、命名空间的套娃
    • 5、命名空间的自动合并
  • 二、缺省参数
    • 1、为什么要引入缺省参数?
    • 2、缺省参数的基本用法
    • 3、缺省的参数必须从右向左
    • 4、缺省参数不能声明和定义同时给
  • 三、函数重载
    • 1、为什么要引入函数重载?
    • 2、函数重载的基本用法
    • 3、当函数重载跟缺省参数碰到一起
  • 四、引用
    • 1、为什么要引入引用?
    • 2、引用的基本用法
    • 3、引用做输出型参数
    • 4、在引用的过程中权限不能放大

我们都知道C++其实就是C语言的升级,那么在“升级”最初阶段就是要对一些在C语言中不足的语法进行改进,这些改进能让我们省很多的力并且代码写起来也比较简洁。

一、命名空间

1、为什么要引入命名空间?

C++引入命名空间主要是为了弥补在C语言中不能存在同名变量或函数的这个语法漏洞。
我们知道在C语言中,相同名称或变量是不能同时存在的:
在这里插入图片描述
如上面的例子中,编译器就会报错。

2、命名空间的基本用法

为了解决这个问题,C++就引入了命名空间,命名空间的主要语法如下:

namespace _name {
	// 成员
	int a = 1;
	// 成员
	double b = 1.1;
}

命名空间使用,namespace这个关键自定义,在命名空间中我们可以定义各种成员,我们几乎可以定义所有的东西:变量、函数、结构体(类)、命名空间(嵌套定义)……

而当我们要在命名空间外使用这些成员时,我就必须得加上一个“域作用限定符”:

_name::

在这里插入图片描述
而如果不加上,就会报错:
在这里插入图片描述
这是因为C++的编译器也和C语言的编译器一样默认只会在全局去寻找。

这样我们就可以同时定义两个同名函数了,比如在全局也有一个同名的Add函数:
在这里插入图片描述

3、展开命名空间

而如果我们不想每次使用都要加上与作用限定符或者某一个成员被使用的次数太过频繁,我们就可以将命名空间进行展开:
全部展开

using namespace _name;

在这里插入图片描述
当然,当我们展命名空间后,也是不能存在同名函数的,因为编译器会依次在全局和命名空间中查找,如果找到两个同名函数,就会存在歧义:
在这里插入图片描述
上面展示的是将命名空间全部展开,而如果我们只是经常要用到命名空间中的某一个成员,而并不想展开其他成员,那我们就可以使用部分展开

using _name::Add;

在这里插入图片描述
而对其他成员,我们依然要加上域作用限定符:
在这里插入图片描述

4、命名空间的套娃

在命名空间中也是可以再定义命名空间的:
在这里插入图片描述
这样,我们就可以再定义很多的同名变量和函数了。
在使用的时候其实也和C语言的指针解引用一样,再加上一个域作用限定符就行了:
在这里插入图片描述
理论上我们可以嵌套无数层的命名空间,但在实际应用中我们最多就嵌套两层就足够了。

5、命名空间的自动合并

那么问题来了,如果定义了同名的命名空间编译器会不会报错呢?
答案是不会的,当我们定义了多个命名空间,它们会自动合并:
在这里插入图片描述

二、缺省参数

1、为什么要引入缺省参数?

在C语言中,当我们要对完成某些功能的函数,进行传参时,总是会遇到不知道具体参数要传多少的情况,比如我们要写一个栈,我们想要在初始化接口中给栈分配一个空间,因为场景的不同,我们总不能具体知道要分配多少空间:

typedef struct Stack {
	int* array;
	int size;
	int capacity;
} Stack;

void StackInit(Stack* pst) {
	assert(pst);
	pst->array = (int*)malloc((? ) * sizeof(int));
	if (NULL == pst->array) {
		perror("malloc fail!\n");
		exit(-1);
	}
	pst->size = 0;
	pst->capacity = ? ;
}

针对这种情况,C++就引入了缺省参数来解决。

2、缺省参数的基本用法

缺省参数就是在函数定义时,在形参部分给一个“缺省值”:

void StackInit(Stack* pst, int n = 4) {
	assert(pst);
	pst->array = (int*)malloc((?n) * sizeof(int));
	if (NULL == pst->array) {
		perror("malloc fail!\n");
		exit(-1);
	}
	pst->size = 0;
	pst->capacity = n ;
}

当我们使用时,可以显示给值或者不显示给值:
在这里插入图片描述
从结果中我们可以看出,当我们显示给值的时候,初始化用的n就是我们显示给的值,而当我们不显示给值的时候就是用的是默认的(缺省的)。

3、缺省的参数必须从右向左

在给缺省参数时,缺省参数的顺序一定是从右向左的,也就是说,缺省参数一定实在参数列表的右端并且一定是连续的,例如:
在这里插入图片描述
而不能出现下面这样的情况:
在这里插入图片描述
置于为什么要这样,只能说是“规定”,不要问为什么。

4、缺省参数不能声明和定义同时给

缺省参数还有一点需要注意的是,缺省参数不能声明和定义同时给:
在这里插入图片描述
这样做的目的主要是为了防止声明和定义给的缺省值不一致,从而导致调用存在歧义。
但我们可以只在声明给,定义不给:
在这里插入图片描述

三、函数重载

1、为什么要引入函数重载?

我们在C语言中有时候会需要一些逻辑非常相似,但就是参数类型不同的函数,比如我们再排序中经常要使用到的交换两个变量的函数Swap,对于交换int和double类型,我们就必须写两个不同名的函数:
在这里插入图片描述

这样是不是很烦啊?
所以为了解决这个问题,C++就引入了函数重载。

2、函数重载的基本用法

有了函数重载,我们上面的这两个函数就可以同名了:
在这里插入图片描述
函数重载有三个要点:

1.参数的类型不同
2.参数的顺序不同(不同类型的参数的顺序不同)
3.参数的个数不同

上面的例子就是类型不同。
然后是参数的顺序不同,一定要是不同类型的参数的顺序不同,例如下面这个例子:
在这里插入图片描述
而如果只是参数名不同,而两个参数都是同一类型就会报错:
在这里插入图片描述
因为编译器是根据不同类型参数的位置来判断到底该调用哪一个函数的,这样做会让编译器存在歧义。

然后是个数不同:
在这里插入图片描述
这个祈其实就不用多说,编译器会根据参数的个数来判断到底该调用哪一个函数。

3、当函数重载跟缺省参数碰到一起

而如果函数重载跟缺省参数碰到一起,会发生什么呢?
例如下面这个例子:
在这里插入图片描述

从结果我们可以看出是没问题的,因为它们之间符合了参数类型不同,而参数有没有缺省值是没有关系的。
但下面这个例子就不同了:
在这里插入图片描述
在这个例子中,虽然两个函数也满足了函数重载的条件只以——参数的个数不同,但是编译器在调用的时候可能会存在歧义,因为像上面这样只给一个参数的调用,对于两个函数来说都行得通,第一个函数本身就只有一个参数,而第二个有缺省值的函数只给一个参数也是能正常调用的。
所以如果在重载函数的时候想要给缺省参数,就一定要注意调用歧义的情况。

四、引用

1、为什么要引入引用?

我们都知道C语言有指针,但C++的祖师爷在使用指针的时候发现:C语言这个指针,用起来也太不方便了吧。例如我们要写一个交换函数Swap:
在这里插入图片描述
如上面这个例子,祖师爷觉得有两个地方很麻烦,一是在Swap函数内想要拿到数据就必须得对指针解引用,二是在调用的时候要对变量取地址。
所以祖师爷为了解决这两个问题,在C++中引入了引用。

2、引用的基本用法

引用如果按底层来理解,其实它也使用指针来实现的,只不过它较之指针使用起来更方便。
引用可以理解为是某一个变量的别名:
引用的定义形式如下:

int a = 1;
int& b = a;

以前在C++中的取地址操作符“&”,现在到了C++中就有了另一个功能,将其放在类型后面就表示某个类型的引用。
之所以称为“别名”是因为,引用基本可以当做被它引用的对象来使用,对引用进行自加自减,对象本身也会发生变化:
在这里插入图片描述

在使用引用时候需要注意的一点是引用必须在定义的时候初始化,所以也就不存在什么“野引用”的说法。
还有一点是引用的只想不能改变,也就是说一个引用只能做一个变量的别名,而不像指针一样能改变其指向。

3、引用做输出型参数

由于引用的特性,所以我们日后会经常使用引用来做输出型参数,比如我们现在实现一个简单的自加函数:
在这里插入图片描述

4、在引用的过程中权限不能放大

怎样理解这一点呢?先看下面这个例子:
在这里插入图片描述
报错的原因就是,引用将原本变量的权限放大了,我们知道const修饰的变量是只能读不能写的(不能改变),但引用默认是能读能写的,这样就是权限放大了。

想要消除报错,就可以对引用也加上const:
在这里插入图片描述
这成为“权限的平移”。
权限不仅可以“平移”,也可以“缩小”:
在这里插入图片描述

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

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

相关文章

为什么我们需要加快推进数字孪生技术?

数字孪生技术以其强大的潜力和应用前景,引起了各行各业的广泛关注和热切期待。那么,究竟为什么要加快推进数字孪生技术呢? 首先,数字孪生技术能够实现现实世界与虚拟世界的无缝连接,为各行业带来了前所未有的创新机遇…

Vue电商项目--VUE插件的使用及原理

图片懒加载 图片懒加载,就是图片延迟加载。只加载页面可视区域上的图片,等滚动到页面下面时,再加载对应视口上的图片 而在vue中有一个插件 vue-lazyload - npm (npmjs.com) npm i vue-lazyload 去使用他,这里我们引入了一张图片…

(九)人工智能应用--深度学习原理与实战--前馈神经网络实现MNST手写数字识别

目标: 识别手写体的数字,如图所示: 学习内容: 1、掌握MNIST数据集的加载和查看方法 2、熟练掌握Keras建立前馈神经网络的步骤【重点】 3、掌握模型的编译及拟合方法的使用,理解参数含义【重点】 4、掌握模型的评估方法 5、掌握模型的预测方法 6、掌握自定义图片的处理与预测 …

十分钟掌握使用 SolidJS 构建全栈 CRUD 应用程序

我们可以开始讨论 SolidJS,说它比React更好,但没有必要做这种比较。SolidJS只是众多前端框架之一,旨在在Web上快速创建数据驱动。那么,我们为什么要突出这个新孩子呢? 首先,我们不能忽视SolidJS不使用虚拟…

嗅探抓包工具,解决线上偶现问题来不及抓包的情况阅读目录

目录 背景 实现思路 具体实现 Python 抓包 总结 资料获取方法 背景 测试群里经常看到客户端的同学反馈发现了偶现Bug,但是来不及抓包,最后不了了之,最近出现得比较频繁,所以写个小脚本解决这个问题。 实现思路 之前写过一个…

免费实用的日记应用:Day One for Mac中文版

Day One for Mac是一款运行在Mac平台上的日记软件,你可以使用Day One for mac通过快速菜单栏条目、提醒系统和鼓舞人心的信息来编写更多内容,day one mac版还支持Dropbox同步功能,想要day one mac中文免费版的朋友赶紧来试试吧! …

IPC之一:使用匿名管道进行父子进程间通信的例子

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍匿名管道(又称管道、半双工管道),尽管很多人在编程中使用过管道,但一些特殊的用法还是鲜有文章涉及,本文给出了多个具体的实例,每个实例均附…

Leetcode.1316 不同的循环子字符串

题目链接 Leetcode.1316 不同的循环子字符串 rating : 1837 题目描述 给你一个字符串 text ,请你返回满足下述条件的 不同 非空子字符串的数目: 可以写成某个字符串与其自身相连接的形式(即,可以写为 a a,其中 a 是…

服务器感染了LockBit 3.0勒索病毒,如何确保数据文件完整恢复?

引言: 在数字时代,恶意软件的威胁变得愈发严峻,而LockBit 3.0勒索病毒则是其中的顶尖恶势力之一。其先进的加密技术和毫不留情的勒索手段,使无数人蒙受损失。然而,我们不应束手无策。本文91数据恢复将带您深入了解Loc…

AndroidStudio通过Profiler查找内存泄漏

Fragment内存泄漏: AndroidStudio --> Profiler --> 勾选 show nearest Gc root only,然后查看非weakreference的引用(weakreference是不会导致内存泄漏的),往下就能找自己项目里写的代码,一般此处…

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下,赛道玩家各自精彩。其中,被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆,并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型,AI四小龙谁都不甘其后。 以深耕AIoT软硬一…

ASCP系列电气防火限流式保护器在养老院的应用-安科瑞黄安南

摘要:2020年,我国65岁及以上老年人口数量为1.91亿,老龄化率达到13.5%。总体来看,大部分省市的养老机构数量还较少。养老设施的建设与民生息息相关,养老院的电气安全也非常重要。如果发生电气火灾,对于行动不…

【多模态】24、开放词汇学习到底是什么?

文章目录 一、什么是开放词汇学习二、开放词汇学习的测评和数据集三、开放词汇目标检测3.1 Region-Aware Training3.2 Pseudo-Labeling3.3 Knowledge Distillation-Based3.4 Transfer Learning-Based3.5 总结3.6 效果 参考论文:A Survey on Open-Vocabulary Detecti…

Vue3 事件处理简单应用

去官网学习→事件处理 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 事件处理</h1><button v-on:click"numb 1">点击加1-----{{ numb }}</button><br/&…

独家揭秘Linux内核栈:内核态的奇妙之处和与用户态的差异

理解Linux内核栈可以从以下几个方面来考虑&#xff1a;内核态与用户态&#xff1a;在阅读Linux内核及相关资料时&#xff0c;需要明确它所描述的是内核态还是用户态的内容。这有助于理解所讨论的是在哪个执行环境下进行的操作。进程与线程的描述&#xff1a;用户态的进程和线程…

Yield Guild Games:社区更新 — 2023 年第二季度

本文重点介绍了 Yield Guild Games (YGG) 2023 年第二季度社区更新中涵盖的关键主题&#xff0c;包括公会发展计划 (GAP) 第 3 季的总结、YGG 领导团队的新成员以及 YGG 的最新消息地区公会网络和广泛的游戏合作伙伴生态系统。 在 YGG 品牌焕然一新的基础上&#xff0c;第二季…

ArcGIS Pro基础:【按顺序编号】工具实现属性字段的编号自动赋值

本次介绍一个字段的自动排序编号赋值工具&#xff0c;基于arcgis 的字段计算器工具也可以实现类似功能&#xff0c;但是需要自己写一段代码实现&#xff0c; 相对而言不是很方便。 如下所示&#xff0c;该工具就是【编辑】下的【属性】下的【按顺序编号】工具。 其操作方法是…

Openlayers实战:右键点击,弹出feature信息

鼠标作为一个重要的交互触发手段,不但有左点击,还有右点击。 Openlayers开发的项目中,我们取消鼠标右键默认菜单,右击后获取到的feature的信息值。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可…

Spring系列四:AOP切面编程

文章目录 &#x1f497;AOP-官方文档&#x1f35d;AOP 讲解&#x1f35d;AOP APIs &#x1f497;动态代理&#x1f35d;初始动态代理&#x1f35d;动态代理深入&#x1f35d;AOP问题提出&#x1f4d7;使用土方法解决&#x1f4d7; 对土方法解耦-开发最简单的AOP类&#x1f4d7;…

美国探亲签证怎样预约?

近年来&#xff0c;越来越多的人都对前往美国探亲感兴趣&#xff0c;然而在计划之初&#xff0c;签证预约却可能成为一个让人头疼的问题。那么&#xff0c;究竟如何预约美国探亲签证呢&#xff1f;下面知识人网小编就为大家详细介绍一下预约的流程和注意事项。 首先&#xff0c…