【C++】入门【一】

本节目标


一、C++关键字(C++98)

二、命名空间

三、C++的输入输出

四、缺省函数

五、函数重载

六、引用

七、内联函数

八、auto关键字(C++11)

九、范围for(C++11)

十、指针空值nullptr(C++11)


一.C++关键字(C++98)

  • C++总计63个关键字,C语言32个关键字


二、命名空间

1.命名空间的定义

  • 在C/C++中,变量、函数和后面要学到的类都是大量存在的
  • 这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突
  • 使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染
  • namespace关键字的出现就是针对这种问题的
  • 命名空间要用到namepsace关键字 后面跟命名空间的名字
  • 每个命名空间都是一个新的作用域
  • 一个命名空间就定义了一个新的作用域,里面所有内容都局限于该空间内

2.命名空间的使用

  • 三种使用方法
  • 1.命名空间名称加作用域限定符::
  • 2.使用using将命名空间中的某个成员引入
  • 3.使用using namespace 命名空间名称 引入

三、C++的输入输出

  • 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件<iostream>以及按命名空间使用方法使用std
  • cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在<iostream>头文件中
  • <<是流插入运算符 >>是流提取运算符
  • 使用C++的输入输出比C语言更加方便,不需要手动控制格式,C++的输入输出可以自动识别变量类型
  • 实际上cout和cin分别是ostream和istream类型的对象 << >> 也涉及到一些重载的知识,后续我们才会学到
  • 早期的标准库所有功能都在全局域内,声明在.h的头文件中,后来将其实现在std命名空间内,为了和C语言区分,规定了C++头文件不用带.h,旧的编译器vc6.0还支持.h的,后续编译器已不再支持 所以推荐<iostream> + std的方式

四、缺省函数

1.缺省函数的概念

  • 缺省函数是在声明或者定义函数时为函数的参数指定一个缺省值
  • 在调用该函数时,如果没有指定实参,则采用缺省值

2.缺省函数的分类

  • 全缺省函数
  • 半缺省函数
  • 注意:半缺省函数必须从右到左依次给,不能间隔
  • 注意:缺省函数不能在函数声明和定义中同时出现,否则编译器不知道用哪个
  • 注意:缺省值必须时常量或者全局变量

五、函数重载

1.函数重载的概念

  • 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数
  • 这些同名函数的形参列表(参数个数,类型,或者顺序不同)

2.为什么支持函数重载

  • C++为什么支持函数重载呢,而C语言却不支持?
  • 从程序运行的角度看,C或C++的一个程序要跑起来,需要经历以下阶段
  • 预处理,编译,汇编,链接
  • 实际项目是由多个头文件和多个源文件构成的,当一个cpp文件中调用了一个函数
  • 而此函数定义在另一个cpp文件里,此时调用函数的cpp文件里没有函数的地址
  • 此时怎么办呢?这时候就用到了链接,链接看到了调用另一个cpp文件的函数
  • 然后链接就会到另一个cpp文件里去找函数地址,找到链接在一起
  • 那么链接时,对于这个函数,例如上面的sum函数,编译器会使用哪个名字去找它呢?
  • 这里每个编译器都有自己的函数名修饰规则,windows下修饰规则过于复杂,我们这里使用linux里的修饰规则来演示
  •  
  •  看完上面,大家应该理解了为什么C语言不支持重载,因为同名函数没办法区分
  • 而C++是通过函数名修饰规则来区分函数的
  • 只有参数不同,修饰出来的名字就不同,就支持了重载
  • 注意:如果两个函数 名字跟参数 都一样, 仅仅返回值不同,是不构成重载的,编译器无法区分

六、引用

1.引用的概念

  • 引用就是取外号,不是定义一个新变量,而是给已存在的变量取一个新名字
  • 编译器不会为此引用开辟新空间,它和引用的变量共用一块内存空间
  • 使用方法如下
  • 注意:引用类型必须和引用实体是同一种类型的

2.引用的特性

  • 1.引用在定义时必须初始化
  • 2.一个变量可以有多个引用
  • 引用一旦引用一个实体,再不能引用其他实体

3.常引用

  • 如果引用的是个常量的话,需要加const

4.使用场景

  • 1.做函数参数,跟指针作用类似,修改此变量可改变此变量值
  • 2.做返回值
  • 在一般的传值返回下,都会产生一个返回值的临时变量再返回
  • 用引用的情况下,返回的就是此变量,不会建造一个临时变量,增加了效率
  • 但是有几点注意事项:
  • 如果函数返回时,出了作用域,返回对象还在,则可以使用引用返回,如果已经释放还给系统,则必须使用传值返回

5.传引用返回,传值返回效率比较

6.引用和指针的区别

  • 在语法上,引用仅仅是个别名,没有独立空间,和其引用对象共用同一块内存空间
  • 但是在底层实现上实际占有空间,因为引用底层是用指针来实现的
  • 区别:
  • 1.引用定义变量新别名,指针存储一个变量地址
  • 2.引用定义时必须初始化,指针不需要
  • 3.引用在引用一个实体后,无法再引用其他实体,指针可以切换指向
  • 4.没有NULL引用,但有NULL指针
  • 5.在sizeof中含义不同,引用结果为引用类型的大小,指针则只是指针变量的大小,例如4个字节
  • 6.引用自加++,引用对象+1,指针自加++,指针向后偏移一个类型大小
  • 7.有多级指针,但是没有多级引用
  • 8.访问实体方式不同,指针需要显式解引用,引用则是编译器自己处理
  • 9.引用比指针用起来相对更安全

七、内联函数

1.内联函数的概念

  • 一个函数前面用inline修饰,则叫做内联函数
  • 内联函数跟宏类似,内联函数在编译期间,会被展开,没有了调用函数栈帧的开销,提升了程序运行的效率
  • 下面两张区别图, call的意思是跳转

2.内联函数的特性

  • inline内联函数是一种以空间换时间的方法
  • 缺陷是 目标文件可能变大 优点是 少了函数调用开销,提高了程序运行效率
  • inline对于编译器只是一个建议,一般建议将函数里面代码量少的进行inline,如果调用频繁且递归的还是建议不用inline
  • inline不建议声明和定义分离,否则会导致链接失败,因为inline函数被展开,就没有函数地址了,链接就会找不到

3.相关面试题

  • 宏的优缺点?
  • 优点 1.增强了代码的复用性 2.提高性能
  • 缺点 1.不方便调试宏(预编译替换了)2.导致代码可读性差,可维护性差,容易误用 3.没有类型安全的检查
  • C++有哪些技术可以替代宏?
  • 1.常量定义const enum
  • 2.短小函数定义 如inline内联函数

八、auto关键字(C++11)

  • 有一些特别长的类型名,如后面要学的STL迭代器,太长写起来耗时且容易写错、
  • 如果用typedef给类型起别名的话,不是特别好,有些情况下例如加了const就不行了
  • 此时就产生了auto关键字 auto可以理解成一种变量类型,写在变量前面
  • 可以自动的推断变量类型
  • typeid是获取变量类型的库函数
  • auto使用注意:定义变量时必须初始化,否则无法推导,编译器在编译器会将其auto转变为其变量实际类型
  • auto使用注意:auto不能用作形参,不能用来声明数组

九、范围for(C++11)

1.范围for语法

  • 在C++98要想遍历数组得这样
  • 而范围for可以简化遍历操作
  • 这样就可以了

2.范围for使用条件


十、指针空值(nullptr)(C++11)

  • 以前喜欢给野指针赋予NULL
  • 但其实NULL其实是个宏
  • 在C++11里面用nullptr替代了NULL
  • 为了代码的健壮性,建议使用nullptr

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

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

相关文章

RabbitMQ7:消息转换器

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)

通过bdf号查看 -s &#xff08;bus&#xff09; lspci -s 03:00.0通过vendor id或者device id等设备查看 -d &#xff08;device&#xff09; lspci -d 15b3: #这里是vendor号&#xff0c;所以在前面 lspci -d :1021 #这里是设备号&#xff0c;所以要:在前vendorid和deviceid…

基于Matlab深度学习的CT影像识别系统研究与实现

通过使用AlexNet、GoogLeNet和VGGNet等预训练模型&#xff0c;并结合迁移学习技术&#xff0c;对CT影像进行特征提取和分类。系统在公开数据集上进行了训练和测试&#xff0c;结果表明&#xff0c;该方法能够有效区分COVID-19和非COVID-19的CT影像&#xff0c;具有较高的准确率…

操作系统 锁——针对实习面试

目录 操作系统 锁什么是死锁&#xff1f;说说死锁产生的条件&#xff1f;死锁如何预防&#xff1f;死锁如何避免&#xff1f;银行家算法具体怎么操作&#xff1f;死锁如何解决&#xff1f;死锁会产生什么影响&#xff1f;乐观锁与悲观锁有什么区别&#xff1f; 操作系统 锁 什么…

【NLP 1、人工智能与NLP简介】

人人都不看好你&#xff0c;可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg&#xff1a;特定场景下的文本分类、垂直领域下的对…

Android系统开发-判断相机是否在使用

AppOpsManager接口startWatchingActive(int[], OnOpActiveChangedListener) 监听相机是否被使用 必须是系统应用有 <uses-permission android:name"android.permission.WATCH_APPOPS"/> 权限API>30 反射调用startWatchingActive(int[], OnOpActiveChangedL…

C#结构体排序(数组)

结构体排序&#xff08;数组&#xff09; 1 示例1.1 以PointF为例展示效果1.2 运行结果展示 2实际运用2.1 创建结构体2.2 调用示例2.3 运行结果展示 1 示例 1.1 以PointF为例展示效果 private void button1_Click(object sender, EventArgs e) {Random random new Random();…

搭建AI知识库:打造坚实的团队知识堡垒

在信息爆炸的时代&#xff0c;企业面临着知识管理的挑战。团队知识堡垒的构建&#xff0c;即搭建一个高效的AI知识库&#xff0c;对于保护和利用知识资产、提升团队协作效率和创新能力至关重要。本文将探讨搭建AI知识库的重要性、策略以及如何通过这一系统打造坚实的团队知识堡…

(五)Ubuntu22.04+Stable-Diffusion-webui AI绘画 模型转换插件安装及其使用

一、说明 这是秋叶大佬开发的一个模型转换插件&#xff0c;秋叶整合包中自带。如果你的 Stable Diffusion WebUI 中没有这个插件&#xff0c;请使用下面这个地址安装&#xff0c;安装完成之后别忘了重启 WebUI。 模型转换插件 https://github.com/Akegarasu/sd-webui-model-c…

DevExpress的web Dashboard应用

本文旨在从零开始创建一个包含dashboard的应用 一、前期准备 1、语言&#xff1a;C# 2、软件&#xff1a;Visual Studio 2019 3、框架&#xff1a;DevExpress19.2(付费)、ASP.NET(Web) 4、组件&#xff1a;dashboard 二、创建ASP.NET Web窗体仪表板应用程序 1、创建一个空的w…

记录下在html文件中如何直接使用npm依赖,以threejs为例

参考&#xff1a; https://www.cnblogs.com/shayloyuki/p/17191489.html 共三种方式 我的代码截图 方式一&#xff1a; threejsDemo_script.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&…

SpringMVC-Day1

SpringMVC 1.SpringMVC介绍 springMVC是一种基于Java实现MVC模型的轻量级Web框架 优点&#xff1a; 使用简单&#xff0c;开发便捷&#xff08;相较于Servelt&#xff09; 灵活性强 使用SpringMVC技术开发web程序流程 创建web工程&#xff08;Maven结构&#xff09; 设置…

鸿蒙面试 --- 性能优化

性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中&#xff0c;动画可以为用户界面增添生动、流畅的交互效果&#xff0c;提升用户对应用的好感度。然而&#xff0c;滥用动画也会导致应用性能下降&#xff0c;消耗过多的系统资源&#xff0c;…

C#变量和函数如何和unity组件绑定

1.Button On_click (1)GameObject通过Add component添加上Script (2)Button选GameObject组件而不是直接选Script,直接选Script出现不了Script中的函数 2.RawImage 上面是错的 3.Text 上面是错的&#xff0c;应该是直接在GameObject里面填上对应的值 总结&#xff1a; …

el-dialog中调用resetFields()方法重置表单报错

前言 在开发中&#xff0c;弹框和表单是两个常见的组件&#xff0c;它们通常一起使用以实现用户交互和数据输入。然而&#xff0c;当我们尝试在弹框中调用表单的 resetFields() 方法时&#xff0c;有时会遇到报错的情况。 一、用法错误 确保 this.$refs[ruleForm].resetFields…

TCP网络套接字

引言 前面我们已经介绍了udp套接字的相关编写&#xff0c;本文主要介绍TCP套接字的相关接口和一些相关知识&#xff0c;方便大家后续对TCP的进一步理解。 相关接口 1、socket 这个接口我们已经在前面有所了解&#xff0c;这里我们再重新回顾一下 第一个参数我们依然使用AF…

rustdesk 自建服务

RustDesk 部署RustDesk sudo docker image pull rustdesk/rustdesk-server sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v pwd:/root -td --nethost rustdesk/rustdesk-server hbbs sudo docker run --name hbbr -p 2111…

Java面试问答FAQ

目录&#xff1a; 1、post为什么会发送两次请求&#xff1f;2、单核CPU支持多线程吗&#xff1f;3、ConcurrentHashMap 如何保证线程的安全性&#xff1f; 1、post为什么会发送两次请求&#xff1f; A&#xff1a;那是因为浏览器的安全策略&#xff08;同源策略&#xff09;决…

【一篇搞定配置】网络分析工具WireShark的安装与入门使用

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

11.28周四F34-Day9打卡

文章目录 1. 你需要的是更多的练习。解析答案:【解析答案分析】【拓展内容】2. 跟我说说你昨天买什么了。解析答案:【解析答案分析】3. 他跟你说的是错的。解析答案:【解析答案分析】【对比分析】4. 原因是她没有通过考试。解析答案:【解析答案分析】5. 你说的和他告诉我们…