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

【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.mfbz.cn/a/64624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Python批量复制文件,方法有9种,方便快捷

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 当我们复制一个文件时用复制粘贴就可以了,如果是多个文件呢? 就会很麻烦了! 今天给大家介绍一下用Python批量复制文件,方法有九种!希望对你有帮助 1. Shutil Copy…

【音视频】vms布署说明

目录 外场布署场景(99%) 研发实验场景(1%) 高级玩法 证书安装方法 外场布署场景(99%) 下面两种场景,为本产品主要应用场景,2023-08-08日后(统一所有证书)…

macOS下Django环境搭建-docker运行Django

1. macOS升级pip /Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 2. 卸载Python3.9.5版本 $ sudo rm -rf /usr/local/bin/python3 $ sudo rm -rf /usr/local/bin/pip3 $ sudo rm -rf /Library/Frameworks/Python.framework 3. 安装P…

Vue3自定义简单的Swiper滑动组件-触控板滑动鼠标滑动左右箭头滑动-demo

代码实现了一个基本的滑动功能,通过鼠标按下、鼠标松开和鼠标移动事件来监听滑动操作。 具体实现逻辑如下: 在 onMounted 钩子函数中,我们为滚动容器添加了三个事件监听器:mousedown 事件:当鼠标按下时,设置…

TCP 三次握手,四次挥手

1、三次握手 第一次握手 SYN 等于1,SeqX 第二次握手 SYN等于1 ACK等于1,SeqY,AckX1 第三次SYN等于0 ACK等于1,SeqX1,AckY1 ackRow都是对应请求seqraw,三次握手后,Seq就是服务器前一个包中的ac…

Unity数字可视化学校_昼夜(三)

1、删除不需要的 UI using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class EnvControl : MonoBehaviour {//UIprivate Button btnTime;private Text txtTime; //材质public List<Material> matListnew Li…

解决word打字卡顿问题的方法

❤ 2023.8.5 ❤ 最近整理论文&#xff0c;本来我是wps死忠粉&#xff0c;奈何wps不支持latex公式。。。 无奈用起了word&#xff0c;但是谁想字数稍微多了一点&#xff0c;word就卡得欲仙欲死&#xff0c;打个字过去2s才显示出来&#xff0c;删除的时候都不知道自己删了几个字…

QGIS二次开发三:显示Shapefile

Shapefile 为 OGR 所支持的最重要的数据格式之一&#xff0c;自然可以被 QGIS 加载。那么该如何显示Shapefile呢&#xff1f; 一、先上代码 #include <qgsapplication.h> #include <qgsproviderregistry.h> #include <qgsmapcanvas.h> #include <qgsvec…

每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)

今日份题目&#xff1a; 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。 示例1 输入&#xff1a;s "abaccdeff" 输出&#xff1a;b 示例2 输入&#xff1a;s "" 输出&#xff1a; 提示 0 …

MySQL流程控制(二十八)

二八佳人体似酥&#xff0c;腰悬利剑斩愚夫&#xff0c;虽然不见人头落,暗里教君骨髓枯。 上一章简单介绍了MySQL变量(二十七) ,如果没有看过,请观看上一章 一. 定义条件与处理程序 定义条件是事先定义程序执行过程中可能遇到的问题&#xff0c;处理程序定义了在遇到问题时应…

BIO,NIO,AIO总结

文章目录 1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例 1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别1)Non-blocking IO&#xff08;非阻塞IO&#xff09;2)Buffer(缓冲区)3)Channel (通道)4)Selector (选择器) 2.3 NIO 读数据和写数据方式…

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接 背景目标依赖配置文件如下项目结构如下相关配置如下启动代码如下Controller如下启动成功接口调用成功 背景 工作做了一段时间&#xff0c;回忆起之前有个公司有线下笔试&#xff0c;要求考生做一个什么功能&#x…

无涯教程-Perl - fileno函数

描述 此函数返回指定的FILEHANDLE的文件描述符号(由C和POSIX函数使用)。通常,这仅在使用select函数和任何低级tty函数时才有用。 语法 以下是此函数的简单语法- fileno FILEHANDLE返回值 此函数返回FILEHANDLE的文件描述符(数字),失败时不确定。 Perl 中的 fileno函数 - 无…

考研算法38天:反序输出 【字符串的翻转】

题目 题目收获 很简单的一道题&#xff0c;但是还是有收获的&#xff0c;我发现我连scanf的字符串输入都忘记咋用了。。。。。我一开始写的 #include <iostream> #include <cstring> using namespace std;void deserve(string &str){int n str.size();int…

c语言每日一练(3)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

element-plus:el-date-picker日期只选择年月不要日

<el-date-picker v-model"value" type"month" format"YYYY-MM" value-format"YYYY-MM" />使用format属性将时间显示格式修改为YYYY–MM 年月格式 使用value-format将绑定值的格式修改为YYYY–MM年月格式

vcruntime140_1.dll修复的方法大全,缺失vcruntime140_1.dll解决方法分享

vcruntime140_1.dll这个文件在电脑里属于挺重要的一个文件&#xff0c;一但它缺失了&#xff0c;那么很多程序都是运行不了的&#xff0c;今天我们就来讲解一下这个vcruntime140_1.dll修复以及它的一些作用和属性。 一.vcruntime140_1.dll的作用 vcruntime140_1.dll是Microso…

【java安全】无Commons-Collections的Shiro550反序列化利用

文章目录 【java安全】无Commons-Collections的Shiro550反序列化利用Shiro550利用的难点CommonsBeanutils1是否可以Shiro中&#xff1f;什么是serialVersionUID&#xff1f;W 无依赖的Shiro反序列化利用链POC 【java安全】无Commons-Collections的Shiro550反序列化利用 Shiro5…

使用go-zero快速构建微服务

本文是对 使用go-zero快速构建微服务[1]的亲手实践 编写API Gateway代码 mkdir bookstore && cd bookstorego mod init bookstore mkdir api && goctl api -o api/bookstore.api syntax "v1"info(title: "xx使用go-zero"desc: "xx用…

Visual Studio配置PCL库

Visual Studio配置PCL库 Debug和Release配置新建项目配置属性表测试参考 Debug和Release Debug和Release的配置过程一模一样&#xff0c;唯一区别就在于最后一步插入的附加依赖项不同&#xff0c;因此下面以debug为例。 配置新建项目 1、新建一个C空项目&#xff0c;模式设置…