C语言过度C++语法补充(面向对象之前语法)

目录

1. C++相较于C语言新增的语法

0. C++ 中的输入输出

1. 命名空间

1. 我们如何定义一个命名空间?

2. 如何使用一个命名空间

3. 命名空间中可以定义什么?

4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何? 

5. 总结~~撒花~~

2. 缺省参数(默认参数)

1. 全缺省

2. 半缺省

3. 用途

3. 函数重载

1. 什么是函数重载

2. 为什么C语言不支持函数重载,而C++支持函数重载

4. 引用

1. 什么是引用,如何定义一个引用

2. 权限的放大和缩小?

2. C++相较于C语言有所变化的几个点

1. "auto" 关键字

2. "NULL" 与 "nullptr"

3. 内联函数 "inline"

4. 结构体

3. 总结


前言:

各位小伙伴在学完C语言之后,向C++进军的话,有一些需要补充的小知识点,也是C++祖师爷对C语言的一下小不满,这篇文章就带大家这这些琐碎的知识点一网打尽~~!!!

今天是2024年6月7日,顺便说一句:高考加油,奥里给!!!

1. C++相较于C语言新增的语法

0. C++ 中的输入输出

有C语言的基础,我们直接来看C++的代码:

这里的 using namespace std; 我们先不关注,在下一部分 “命名空间” 中我们再细说~! 

C++ 中的 cin 对应 C语言中的 scanf() ,但是不再使用 & 符号,称为“流提取”

C++ 中的 cout 对应 C语言中的 printf() ,并且我们不再需要关注数据的类型, 称为 “流插入”

这里  cin、cout  中的 c 代表的是 console 控制台

这里的 endl 指的是 end + line 有换行的含义

1. 命名空间

相较于C语言,C++中首次引入了命名空间的概念,其主要的目的是解决变量/结构/函数命名冲突的问题~

这里为大家举一个例子:

下面这样的代码,当我们运行的时候,就会报这样的错误,因为在<stdlib.h>中 rand 是被定义为产生随机值的函数的,所以我们这样使用就报错了。

那么,为了解决这样类似的命名冲突的问题,C++中就有了命名空间,那么命名空间是如何使用的呢?

首先,我们能看到我们前面的关于命名冲突的问题被解决啦~,之后我们看图上的两个另外的红色箭头!

1. 我们如何定义一个命名空间?
namespace 命名空间的名称
{// 命名空间的内容
}
如:
namespace xy
{int rand = 0;
}

值得注意的是:相较于C语言的自定义类型(结构体、枚举、联合体(共用体))来说,命名空间这里的 右边大括号 后边是没有 ";" 分号的~!

2. 如何使用一个命名空间

我们看到我们上图(不是代码框)中 中间向左下的那个红色箭头,使用 :: 来访问命名空间,这就是关于命名空间最基础的使用方法,直接访问指定命名空间内的指定成员,但是命名空间不仅仅可以这样!

结合 C++中的输入输出中的 using namespace std; 我们就能看出命名空间的第二种用法,就是完全展开命名空间,这里的展开命名空间与头文件的展开有所不同:

头文件的展开是将头文件内的内容全部拷贝到展开头文件的地方,但是命名空间的展开往往是一种声明,怎么理解呢?

我们知道 C语言 编译器的默认访问顺序是:

先访问局部作用域,再访问全局作用域。

在C++中,如果没有完全展开命名空间,编译器的默认访问顺序是和C语言的完全一致的(为了兼容C语言),但是如果完全展开了命名空间,就会在访问完全局作用域之后,去访问完全展开的命名空间。

这里还有一个 小Tips, 就是 如果我们同时展开多个命名空间,如果展开的多个命名空间中有相同的 名称,也会有重定义的错误!

还有一种命名空间的使用方法,就是鉴于上面的这个tips的风险,我们可以指定展开命名空间中的成员。我们直接上代码解释:

我们可以看到,当我们展开了 命名空间 xy 中的 num2 之后,编译器就认识 num2, 但是不认识num1 。这就是命名空间的最后一种使用方法啦~~

3. 命名空间中可以定义什么?

我们知道了,命名空间的目的和命名空间的定义和使用,那我们再来看看,命名空间中可以定义什么呢?

我们可以看到,命名空间中 几乎就是一个加了一点小限制的(需要一些声明)全局域,可以定义 变量、自定义类型、函数、甚至是命名空间!

这里我们再说一个编译器比较智能的地方,就是假如说,我们指定访问了A命名空间中的一个结构体来创建了一个变量,那么我们在后期使用这个变量的相关操作函数的时候,编译器会默认去找这个变量所在命名空间中的方法来操作这个变量,即使在全局域有相同名称,相同参数的函数!

如图,我们在调用 Push函数的时候,并没有指定调用 xy 命名空间中的 Push函数,理论上他应该是去全局域找Push函数,但是我们在调试的时候发现,他是去调用了 xy 命名空间中的 Push函数。

4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何? 

这里我们 就直接说答案叭!对于 相同或者不同 的文件中如果出现 同名的命名空间 编译器就像他们自行和并,合成一个融合了多个相同命名空间的一个命名空间

5. 总结~~撒花~~

关于命名空间的内容呢,到这里就结束啦,我们可以总结一下,使用命名空间时候的访问顺序,这里为大家将一个小故事,以便于大家理解:

小明的妈妈在做饭的时候,发现家里没有葱了,让小明去地里搞点葱回来。正常情况下,小明应该是先去自己家的地里,看没有葱,如果自己家里没有,再去看村子里的野外地里有没有葱,正常是不会去隔壁王大爷家里搞点葱叭?这就对应了,如果我们不声明展开命名空间,是访问不到命名空间内的成员的。如果王大爷提前说了,“小明,下次吃菜,可以来王大爷家的地里搞点吃”,这样我们就可以去王大爷家的地里拿到葱,同样也可以拿到其他蔬菜。这就对应了,我们就命名空间完全展开,如果王大爷告诉小明妈妈,下次吃葱直接来我们家地里搞,这就对应了,直接访问指定命名空间内的指定成员,还有一种情况就说,王大爷说“乡亲们,我们家里的白菜比较多,你们想吃可以来我们家地里搞点吃”,这就对应了命名空间展开特定的成员

好啦,命名空间的内容其实也是比较多的,但是并不难,大家可以在学习的过程中,慢慢理解,妈慢慢体会~!

2. 缺省参数(默认参数)

1. 全缺省

在C++中,函数可以在定义的时候,我们可以在函数形参位置指定参数的值,这样在函数调用的时候就可以直接调用,或者传入参数调用。

注意点:缺省参数,不能同时写在函数定义中和函数声明中!因为要避免出现两个地方默认值不同的情况,就算两个地方写的默认参数是一样的也不可以~~!

2. 半缺省

我们可以之给定其中一部分形式参数的默认值,但是这里有一个规定,就是缺省必须从右向左依此缺省

因为要  避免编译器不知道将那个实参传给对应的形参。给大家看几种情况。

必须从右向左依此缺省! 

3. 用途

我们回忆,我们使用C语言实现顺序表的时候,是不是不能灵活的控制,开多大的空间,通常是给一个默认值,在此基础上二倍增长,在这种情况下(知道变量大小,或者不知道变量大小的情况同时存在)缺省参数就能用到了:可以作为malloc时候的大小,如果知道多少就传入,不知道就不传入,使用默认参数。

3. 函数重载

1. 什么是函数重载

函数重载,简单的说,就是函数(方法)名相同,参数列表不同(参数的:个数、类型、顺序),几个相同名称,不同参数列表的函数,相互称为:重载函数。

这里有一个注意点:函数重载一定是发生在同一作用域,如果不是同一作用域,是用不到函数重载的~!

在这里也有一个要注意的点:“返回值不影响重载”!

注意点:

在这里呢,Add(1.0, 2.0) ,由于 1.0和2.0字面量的默认类型都是double,我们没有提供与它对应的函数,所以他会发生隐式类型转换,它即可以转化为int类型,又可以转化为float类型,编译器不知道调用哪一个?所以就出现了歧义----多个重载函数。

这里说一个问题?如果是,我们将两个命名空间同时展开,在这两个命名空间中,有一个函数名相同,参数列表不同的函数,他们算不算函数重载

答案是:不算~~!,因为总归不是同一作用域,按照上文在命名空间中的总结来说,展开了命名空间,不是说,王大爷家的菜地就变成村子里的野地了,只是有了一个声明。所有对于上面的情况,如果调用那个两个命名空间都有的函数,结果只能是:编译错误,歧义~!

2. 为什么C语言不支持函数重载,而C++支持函数重载

我们知道C语言,C++在编译的时候,都是经历了四个步骤:

预处理 --  编译 -- 汇编 -- 链接  这四个步骤我们在这里就不详细说了,后期专门一篇文章来说~

在多个文件中函数相互调用,都是在链接拿函数名时候去找的,在C语言编译器上,是不会对函数名做一些修饰的,在C++中是是会对函数名做一些修饰的,比如说在函数名的前面加上函数名的字符个数,在函数名的后面加上函数的参数列表的简称。

知道了这些,我们就可以反推出为什么函数的返回值不能作为函数重载了~!,因为函数是可以直接调用,比如说,一个就返回值的函数,我们可以不接受他的返回值,直接去调用它,这样编译器就没有办法去区分调用那个函数了!如下图:

你能想到 第一个 add() 函数去调用那个吗? 

4. 引用

1. 什么是引用,如何定义一个引用

在C++中,引入了引用的概念,他的作用是 给一个已有的变量起别名,比如:李逵又叫黑旋风,对于变量来说,无论是变量本身还是引用,他们操作的都是同一块内存空间,也就是说他们的内存地址相同的,并且:同一个变量可以有多个别名。

 注意点:引用在定义的时候必须要初始化,并且在之后不能再引用其他同类型的变量。

在之后呢,所有 使用引用的地方,我们都可以将他等价替换成该引用 引用的变量~! 

在这里,我们再来看看,引用的另一个作用:作为函数参数

在C语言中,我们如果想要使用函数交换两个变量,我们就要使用到指针,因为函数栈帧的原因,形参只是实参的一份临时拷贝,所以修改形参不会改变实参,所以我们要使用指针,但是在C++中就可以使用 引用,来交换两个变量! 

2. 权限的放大和缩小?

我们在前文中知道了:引用是给已有的变量起别名,那么现在就会有一些问题:

如果说我们现在定义了一个变量,他的类型是 const int,现在我们搞一个 int 类型的引用去引用这个变量,我们原始的变量是const 的 ,是不能修改的,但是我们现在用一个 int 类型的引用,引用这个变量,反而让他可以改了,这样 是不是 有一个 权限的放大。这样是不被允许的!

权限的平移,和权限的缩小 都是可以的比如:

这里有一个注意点: 

普通的变量的赋值是不涉及权限的放大和缩小,只有指针和引用是设计权限的放大和缩小的!

2. C++相较于C语言有所变化的几个点

1. "auto" 关键字

在C语言中,auto 关键字是默认省略的,在我们定义的每一个变量之前,都是有一个auto的,但是在C++中,auto 关键字 有自动推导变量类型的作用,往往是使用在迭代器中,由于迭代器类型比较长,写起来有点费劲,就可以使用 auto 关键字来自动推导。

2. "NULL" 与 "nullptr"

在C语言中,NULL是被宏定义为 一个将0强制转换为void*类型的一个泛型指针,但是在C++中,NULL不再是指针类型,而是被定义为 0 ,而通常是使用nullptr来代表空指针!如下图:

 C++中使用 NULL 也是可以的,但是在C++11 之后,还是更建议使用 nullptr 来代表空指针

3. 内联函数 "inline"

在C语言和C++中,inline 关键字 都是定义内联函数,但是呢这都是对编译器的建议,建议将一些比较简短的函数,直接展开,减少函数栈帧开辟和销毁的消耗,但是实际还是要看编译器自己的处理。

C语言与C++不同的是,C语言,是要自己将 inline 写出来才有效,但是在C++中,所有的函数前面都隐式的添加了 inline 关键字,就如同上文中 C语言中的 aotu关键字一样~!

4. 结构体

结构体,因为涉及到C++中的面向对象,我们这里就先不细说了,我们就提一下:

1. C语言中,结构体中是不能定义函数的,C++中,结构体中是可以定义函数的。

2. 由于 第一点 就涉及到了 C++中结构体的大小了

目前就说这些,详细的以后在C++面向对象的文章中再说~~!

3. 总结

C语言过度C++,面向对象之前的语法总体上来说是不太难的,但是需要我们多多练习,慢慢体会~~

祖师爷保佑~~,大家写的代码都没BUG!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优维「Easy分析」:一款故障根因分析小神器

背 景 随着微服务架构的普及&#xff0c;现代企业的IT基础设施已经变得越来越复杂。单一的服务可能有多个下游依赖&#xff0c;而这些依赖又可能有自己的子依赖&#xff0c;和主机资源的依赖。在这样的环境中&#xff0c;当某个服务发生故障&#xff0c;确定具体的原因变得尤为…

【Linux】The server quit without updating PID file的几种解决方案

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

微服务架构-微服务实施

目录 一、概述 二、微服务拆分 2.1 概述 2.2 拆分原则 2.3 拆分方法 2.3.1 以数据为维度进行拆分 2.3.2 按照使用场景拆分 2.3.3 重要和非重要的拆分 2.3.4 变和不变的拆分 三、微服务通信 3.1 概述 3.2 微服务通信方式选择 3.3 微服务编排 3.4 API接口设计 3.5 …

C++基础与深度解析 | 类与面向对象编程 | 数据成员 | 成员函数 | 访问限定符与友元 | 构造、析构成员函数 | 字面值类、成员指针与bind交互

文章目录 一、结构体与对象聚合二、成员函数&#xff08;方法&#xff09;三、访问限定符与友元1.访问限定符2.友元&#xff08;慎用&#xff09; 四、构造、析构与复制成员函数1.构造函数2.析构函数3.补充 五、字面值类&#xff0c;成员指针与bind交互1.字面值类2.成员指针3.b…

【MATLAB源码-第224期】基于matlab的快跳频系统仿真采用4FSK,模拟了单音干扰,宽带干扰以及部分频带干扰,输出误码率曲线以及各节点图像。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 跳频通信系统概述 跳频通信系统是一种通过快速切换载波频率来进行信息传输的无线通信技术。它在军事和商业通信中广泛应用&#xff0c;具有较强的抗干扰和抗截获能力。系统设计主要包括信号调制、跳频序列生成、信道模拟以及…

Java 初识

Java 的发展历程 Sun 公司。 Oracle 公司。 普通版本&#xff0c;也叫过渡版本。 正式版本&#xff0c;也叫长期支持版本&#xff08;LTS&#xff09;。 Java SE&#xff0c;Java EE&#xff0c;Java ME Java 技术体系分为三个平台&#xff1a;Java SE&#xff0c;Java EE&a…

G5 - Pix2Pix理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识图像翻译CGANU-NetPix2Pix损失函数模型结构生成器差别器 模型效果总结与心得体会 理论知识 前面已经学习了GAN与CGAN&#xff0c;这节开始学习P…

记一次Linux下Docker镜像服务器磁盘空间清理

我们开发环境Jenkins构建项目时报服务器磁盘空间不足&#xff0c;导致项目自动化构建部署失败&#xff0c; Docker镜像服务器磁盘空间清理我们做了多次了&#xff0c;之前在清理Docker镜像服务器时走了不少弯路&#xff0c;查了不少Docker镜像服务器空间清理&#xff0c;都大同…

AI大数据处理与分析实战--体育问卷分析

AI大数据处理与分析实战–体育问卷分析 前言&#xff1a;前一段时间接了一个需求&#xff0c;使用AI进行数据分析与处理&#xff0c;遂整理了一下大致过程和大致简要结果&#xff08;更详细就不方便放了&#xff09;。 文章目录 AI大数据处理与分析实战--体育问卷分析一、数据…

部署kubesphere报错

安装kubesphere报错命名空间terminted [rootk8smaster ~]# kubectl apply -f kubesphere-installer.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16, unavailable in v1.22; use apiextensions.k8s.io/v1 CustomResourceDefini…

LabVIEW阀性能试验台测控系统

本项目开发的阀性能试验台测控系统是为满足国家和企业相关标准而设计的&#xff0c;主要用于汽车气压制动系统控制装置和调节装置等产品的综合性能测试。系统采用工控机控制&#xff0c;配置电器控制柜&#xff0c;实现运动控制、开关量控制及传感器信号采集&#xff0c;具备数…

【数据结构初阶】--- 顺序表

顺序表&#xff0c;好像学C语言时从来没听过&#xff0c;实际上就是给数组穿了层衣服&#xff0c;本质是一模一样的。 这里的顺序表实际是定义了一个结构体&#xff0c;设计各种函数来实现它的功能&#xff0c;比如说数组中的增删改查插入&#xff0c;这些基本操作其实平时就会…

go语言内置预编译 //go:embed xxx 使用详解

在go语言里面&#xff0c;我们可以使用一个“类注释”的语法来来让编译器帮助我们在编译的时候将一些文件或者目录读取到指定的变量中来供我们使用。 go:embed语法&#xff1a; //go:embed 文件或者目录路径 var 变量名 变量类型 说明&#xff1a; 文件或者目录路径 可以…

【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)

目录 一、 进程1.1 PID(进程标识符)1.2 内存指针1.3 文件描述符表1.4 状态1.5 优先级1.6 记账信息1.7 上下文 二、线程三、总结&#xff1a;进程和线程之间的区别&#xff08;非常非常非常重要&#xff0c;面试必考题&#xff09; 一、 进程 简单来介绍一下什么是进程&#xf…

C++学习/复习13--list概述

一、list概念 1.带头双向链表 2.构造函数 3.迭代器&#xff08;其迭代器需尤其注意&#xff09; 4、size 5.front/back 6.插入删除 删除时的迭代器失效 由于list的节点特殊&#xff0c;既有数据又有指针&#xff0c;其实现需要节点/迭代器/list各成一类再组合

Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统电脑上快速本地部署一个文字生成音乐的AI创作工具MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用。 MusicG…

Spring AI 第二讲 之 Chat Model API 第八节Anthropic 3 Chat

Anthropic Claude 是一系列基础人工智能模型&#xff0c;可用于各种应用。对于开发人员和企业来说&#xff0c;您可以利用 API 访问&#xff0c;直接在 Anthropic 的人工智能基础架构之上进行构建。 Spring AI 支持用于同步和流式文本生成的 Anthropic 消息 API。 Anthropic …

29网课交单平台 epay.php SQL注入漏洞复现

0x01 产品简介 29网课交单平台是一个专注于在线教育和知识付费领域的交单平台。该平台基于PHP开发,通过全开源修复和优化,为用户提供了高效、稳定、安全的在线学习和交易环境。作为知识付费系统的重要组成部分,充分利用了互联网的优势,为用户提供了便捷的支付方式、高效的…

2.Rust自动生成文件解析

目录 一、生成目录解析二、生成文件解析2.1 Cargo.toml2.2 main函数解析 一、生成目录解析 先使用cargo clean命令删除所有生成的文件&#xff0c;下图显示了目录结构和 main.rs文件 使用cargo new testrust时自动创建出名为testrust的Rust项目。内部主要包含一个src的源码文…

[网鼎杯 2020 青龙组]jocker

运行程序,发现是要我们自己输入 那么肯定是拿到enc慢慢还原 32位,无壳 进来就红一下报错 这里可以看见长度为24 动调一下看看 这里进行了大量的异或 这里是对地址开始的硬编码进行异或,从而达到smc的效果 所以你也可以发现在进行这一步操作之前 encry函数全是报错 你点开…