当前位置: 首页 > news >正文

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!!! 

相关文章:

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

目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间&#xff1f; 2. 如何使用一个命名空间 3. 命名空间中可以定义什么&#xff1f; 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何&#xff1f; 5. 总结~~撒花~~…...

类和对象(二)(C++)

初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化…...

Chrome DevTools解密:成为前端调试大师的终极攻略

Chrome DevTools是一套内置于Google Chrome浏览器中的开发者工具&#xff0c;它允许开发者对网页进行调试、分析和优化。本文将全面介绍DevTools的功能、使用方法以及注意事项&#xff0c;帮助开发者更好地利用这些工具来提升开发效率和网页性能。 一、简介 1. DevTools是什么…...

【python】OpenCV—Cartoonify and Portray

参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…...

制作AI问答机器人:从0到1的完整指南

在数字化转型的浪潮中&#xff0c;企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力&#xff0c;成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人&#xff0c;并强调其功能体…...

mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日

解决方法也简单&#xff1a; 自定义个一个 Date2LongTypeHandler <resultMap id"BeanResult" type"XXXX.XXXXDO"><result column"gmt_create" property"gmtCreate" jdbcType"DATE" javaType"java.lang.Long&…...

信息系统项目管理师0148:输出(9项目范围管理—9.3规划范围管理—9.3.3输出)

点击查看专栏目录 文章目录 9.3.3 输出 9.3.3 输出 范围管理计划 范围管理计划是项目管理计划的组成部分&#xff0c;描述将如何定义、制定、监督、控制和确认项 目范围。范围管理计划用于指导如下过程和相关工作&#xff1a; ①制定项目范围说明书&#xff1b;②根据详细项目范…...

解决 SQLyog 连接 MySQL 8 连不上和 SQLyog Trial 试用到期的问题

今天发现 SQLyog 突然连不上 MySQL 了&#xff0c;跟之前不一样的地方就是我升级了 MySQL&#xff0c;升级到了 MySQL 8。 原来是因为 MySQL 8 引入了新的密码验证机制。在 MySQL 8 中默认的密码验证插件从 mysql_native_password 更换为 caching_sha2_password。我的 SQLYog …...

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

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

数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法

频繁项集、闭项集和关联规则 频繁项集&#xff1a;出现的次数超过最小支持度计数阈值 闭频繁项集&#xff1a;一个集合他的超集(包含这个集合的集合)在数据库里面的数量和这个集合在这个数据库里面的数量不一样,这个集合就是闭项集 如果这个集合还是频繁的,那么他就是极大频…...

Locust:用Python编写可扩展的负载测试

Locust&#xff1a;简化性能测试&#xff0c;让负载模拟更直观- 精选真开源&#xff0c;释放新价值。 概览 Locust是一个开源的性能和负载测试工具&#xff0c;专门用于HTTP和其他协议的测试。它采用开发者友好的方法&#xff0c;允许用户使用普通的Python代码来定义测试场景。…...

【Neo4j】Windows11使用Neo4j导入CSV数据可视化知识图谱

Windows11使用Neo4j导入CSV数据可视化知识图谱 序1. 安装JDK21&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;环境配置 2. 安装Neo4j&#xff08;1&#xff09;下载&#xff08;2&#xff09;解压安装&#xff08;3&#xff09;环境配置…...

探索智慧林业系统的总体架构与应用

背景&#xff1a; 随着人们对森林资源保护和管理的重视&#xff0c;智慧林业系统作为一种新兴的林业管理手段&#xff0c;正在逐渐受到广泛关注和应用。智慧林业系统的总体架构设计与应用&#xff0c;将现代信息技术与林业管理相结合&#xff0c;为森林资源的保护、管理和利用…...

【JSP】如何在IDEA上部署JSP WEB开发项目

以我的课设为例&#xff0c;教大家拿到他人的项目后&#xff0c;如何在IDEA上部署。 需要准备&#xff1a; JDK17&#xff08;或者JDK13&#xff09;IntelliJ IDEA 2023.2.6MySQL 8.0Tomcat 9.0 一&#xff0c;新建项目添加文件 1.1复制“位置”的路径 1.2找到该文件夹 1.3…...

用HTML实现拓扑面,动态4D圆环面,可手动调节,富有创新性的案例。(有源代码)

文章目录 前言一、示例二、目录结构三、index.html&#xff08;主页面&#xff09;四、main.js五、Tour4D.js六、swissgl.js七、dat.gui.min.js八、style.css 前言 如果你觉得对代码进行复制粘贴很麻烦的话&#xff0c;你可以直接将资源下载到本地。无需部署&#xff0c;直接可…...

java调用GDAL及JTS实现生成泰森多边形(Voronoi图)的一种方法

目录 一、关于泰森多边形 1.泰森多边形的特性 2.本文的目的 二、实现思路 1.gdal和jts库的maven坐标 2.jts生成泰森多边形的关键代码 3.使用GDAL读取源文件信息的关键代码 4.使用GDAL将生成的泰森多边形写入文件 三、实现结果 1.实现的效果 2.完整代码示例 一、关于…...

Type-C音频转接器方案

在数字化时代&#xff0c;音频设备作为我们生活中不可或缺的一部分&#xff0c;其连接方式的便捷性和高效性显得尤为重要。Type-C音频转接器&#xff0c;作为一种新型的音频连接解决方案&#xff0c;正逐渐走进我们的生活&#xff0c;以其独特的优势改变着我们的音频体验。 一、…...

linux 服务器上离线安装 node nvm

因为是离线环境 如果你是可以访问外网的 下面内容仅供参考 也可以继续按步骤来 node 安装路径 Node.js — Download Node.js nvm 安装路径 Tags nvm-sh/nvm GitHub 后来发现 nvm安装后 nvm use 版本号 报错 让我去nvm install 版本 我是内网环境 install不了 下面 你要 把安…...

Web前端三大主流框架:React、Angular和Vue的比较与选择

Web前端三大主流框架&#xff1a;React、Angular和Vue的比较与选择 Web前端技术的快速发展为开发者提供了丰富的工具和框架&#xff0c;其中React、Angular和Vue是当前最受欢迎的三大框架。这三个框架各有特点&#xff0c;适用于不同的项目需求和开发团队。本文将对React、Ang…...

C# MemoryCache 缓存应用

摘要 缓存是一种非常常见的性能优化技术&#xff0c;在开发过程中经常会用到。.NET提供了内置的内存缓存类 MemoryCache&#xff0c;它可以很方便地存储数据并在后续的请求中快速读取&#xff0c;从而提高应用程序的响应速度。 正文 通过使用 Microsoft.Extensions.Caching.Me…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...