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

C++:入门篇(补充C语言中的不足)

前言
这篇文章是C++的第一篇文章,主要是补充C语言中存在的不足而扩展的一些新的语法,有了这篇文章作为杂序,后面再介绍其他内容就要清晰地多

C++:入门篇

  • 一、namespace 命名空间
    • (一)域的概念
    • (二)命名空间的使用
      • 1、创建命名空间域
      • 2、命名空间域的嵌套使用
      • 3、using 关键字
  • 二、缺省参数
  • 三、函数重载
  • 四、引用
    • (一)引用的使用
    • (二)const 引用
      • 1、变量的权限不能放大
      • 2、指针的权限不能放大
      • 3、临时对象
    • (三)引用和指针的区别
  • 五、inline 关键字
    • (一)宏的不足
    • (二)inline 的用法
  • 六、nullptr 关键字
    • (一)C语言中的NULL
    • (二)nullptr 关键字
      • 结束语

一、namespace 命名空间

在全局区中,c++可能定义有变量、函数、类,而太多的变量定义可能会导致重定义的问题,尤其是小组中多人在进行代码合并时候,往往容易导致错误。我们引入namespace 命名空间关键字。

下面的代码说明在头文件中已经有了 rand 函数了,我们以这个函数名作为变量名必定会产生冲突。
在这里插入图片描述
在这里插入图片描述

(一)域的概念

1、C++中域有函数局部域,全局域,命名空间域,类域
2、域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,有了域隔离,名字冲突就解决了。
3、局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

(二)命名空间的使用

1、namespace 只能定义在全局,当然他还可以嵌套定义
项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
C++标准库都放在⼀个叫==std(standard)==的命名空间中

1、创建命名空间域

这里我们创建了一个命名空间域,因此 rand 变量依旧可以创建在全局区
在这里插入图片描述
在访问命名空间域中的变量时必须标注域的名字。(后面学的类域也是相似)
在这里插入图片描述

2、命名空间域的嵌套使用

这种用法一般是用来解决两个程序员合并代码时候的问题,假如A, B两人都想使用 rand 来作为全局变量,可以用下面的方式
在这里插入图片描述
在这里插入图片描述

3、using 关键字

命名空间域中我们要访问函数或者变量时太麻烦了,有没有办法可以使得我们不加前面的 :: 呢

半放式 : 将命名空间中不与其他全局变量重名的放回全局区
在这里插入图片描述
全放式: 将命名空间的成员全部放在全局区中,但是容易造成错误。因此在项目中不推荐使用 using namesapce std;
在这里插入图片描述

二、缺省参数

缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。

在这里插入图片描述

三、函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数参数个数不同或者类型不同。这个就叫函数重载。

参数类型不同
在这里插入图片描述

参数个数不同
在这里插入图片描述
参数顺序不同
在这里插入图片描述
参数返回值不同
在这里插入图片描述
存在歧义
在这里插入图片描述

四、引用

类型& 引⽤别名 = 引⽤对象;
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。
引⽤在定义时必须初始化,引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

在这里插入图片描述
在这里插入图片描述

(一)引用的使用

引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被
引⽤对象

在这里插入图片描述

(二)const 引用

核心是权限不能放大

1、变量的权限不能放大

在这里插入图片描述

2、指针的权限不能放大

在这里插入图片描述

3、临时对象

int& rb = a3; double d = 12.34; int& rd = d
这样⼀些场景下a
3的和结果保存在⼀个临时对象中存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。

在这里插入图片描述

(三)引用和指针的区别

• 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
• 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下
占4个字节,64位下是8byte)
• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些

五、inline 关键字

(一)宏的不足

C语言中的宏在使用时候往往会产生一些错误,使用 inline就是为了解决这个问题
首先排除我们写宏时候容易少写括号造成错误看下面这种情况,因为没有正确的写宏#define MUL(a, b) ((a) * (b))造成错误,从而有了两个答案。

在这里插入图片描述
再看这种情况,宏的内容写得没有问题,但是因为宏的机制造成错误
在这里插入图片描述
综上,我们有了inline 关键字.

(二)inline 的用法

•⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率。
• inline对于编译器⽽⾔只是⼀个建议,加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
• inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。
在这里插入图片描述

六、nullptr 关键字

(一)C语言中的NULL

在C语言中,NULL是一个宏,定义为0

#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif

这个情况会造成一些谬误
在这里插入图片描述

(二)nullptr 关键字

C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。

在这里插入图片描述

结束语

这是小编C++的第一篇文章,如果觉得文章看了有收获,可以多多关注哦

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TestCraft - GPT支持的测试想法生成器和自动化测试生成器
  • 【论文阅读】01-Survey on Temporal Knowledge Graph
  • PhpStorm 下调试功能配置
  • 粉丝+1,马斯克点赞《黑神话:悟空》
  • PHP一站式解决方案高级房产系统小程序源码
  • 【在Unity完成三维场景多人在线同时操作的实现方式】
  • 使用Protocol Buffers传输数据
  • 李沐深度学习 自制数据集
  • GenAI 客户支持 — 第 3 部分:为人类设计聊天机器人的聊天界面
  • 数据结构之红黑树的 “奥秘“
  • HarmonyOS学习(七)——UI(五)常用布局总结
  • 多目标应用:四种多目标优化算法(NSGA2、NSPSO、NSDBO、NSCOA)求解柔性作业车间调度问题(FJSP),MATLAB代码
  • ffmpeg7.0 AVFrame的分配与释放
  • 2024年企业级电脑监控软件推荐,精选的电脑监控软件
  • SprinBoot+Vue停车场管理系统的设计与实现
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android Volley源码解析
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript学习总结——原型
  • JS实现简单的MVC模式开发小游戏
  • Python连接Oracle
  • scala基础语法(二)
  • 小程序开发中的那些坑
  • 原生js练习题---第五课
  • 湖北分布式智能数据采集方法有哪些?
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #if和#ifdef区别
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (12)目标检测_SSD基于pytorch搭建代码
  • (3)llvm ir转换过程
  • (30)数组元素和与数字和的绝对差
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (bean配置类的注解开发)学习Spring的第十三天
  • (CPU/GPU)粒子继承贴图颜色发射
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (十七)Flink 容错机制
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)ORM
  • (转)关于pipe()的详细解析
  • (转载)利用webkit抓取动态网页和链接
  • ***测试-HTTP方法
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .“空心村”成因分析及解决对策122344
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .libPaths()设置包加载目录
  • .NET DataGridView数据绑定说明
  • .Net MVC + EF搭建学生管理系统
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET Remoting学习笔记(三)信道
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法