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

devtools/2024/9/20 1:24:07/ 标签: 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++的第一篇文章,如果觉得文章看了有收获,可以多多关注哦

在这里插入图片描述


http://www.ppmy.cn/devtools/111275.html

相关文章

计算机网络 --- 计算机网络的分类

一、计算机网络分类 1.1 按分布范围分类 举例:广域网(WAN)、局域网(LAN) 举例:个域网(PAN) 1.2 按传输技术分类 广播式网络――当一台计算机发送数据分组时,广播范围…

docker-compose 部署 flink

下载 flink 镜像 [rootlocalhost ~]# docker pull flink Using default tag: latest latest: Pulling from library/flink 762bedf4b1b7: Pull complete 95f9bd9906fa: Pull complete a880dee0d8e9: Pull complete 8c5deab9cbd6: Pull complete 56c142282fae: Pull comple…

404 error when doing workload anlysis using locust on OpenAI API (GPT.35)

题意:"使用 Locust 对 OpenAI API (GPT-3.5) 进行工作负载分析时出现 404 错误。" 问题背景: I am trying to do some workload analysis on OpenAI GPT-3.5-TURBO using locust. "我正在使用 Locust 对 OpenAI GPT-3.5-TURBO 进行一些…

Unity基本操作

API手册 Unity 脚本 APIhttps://docs.unity.cn/cn/2022.3/ScriptReference/index.html 在遇到不懂的方法、想更深入的学习或者是想查看是否有相应的方法实现某项功能,可以在Unity官方这里查看脚本。以Transform为例,可以直接搜索,或者在Unit…

狂奔的荣耀,稳健的苹果:AI Agent手机竞速赛

每一次技术革命,都需要一个技术落地的锚点,比如燃油革命时代的汽车,信息革命时代的PC与手机。而这一次以预训练大模型为主导的AI技术爆发中,被认为最有可能成为智能技术落地锚点的,就是AI Agent,或者称为智…

centos 服务器 多网卡 ip 地址 设置

centos 服务器 多网卡 ip 地址 设置 https://blog.csdn.net/xh_w20/article/details/141574357 cd /etc/sysconfig/network-scripts/ sudo systemctl status network ● network.service - LSB: Bring up/down networkingLoaded: loaded (/etc/rc.d/init.d/network; bad; v…

【LeetCode每日一题】——LCR 168.丑数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 中等 三【题目编号】 LCR 168.丑数 四【题目描述…

AI prompt(提示词)

# 好用的用于学习的AI提示词 ## 费曼学习法 请使用费曼学习法,用简单的语言解释(量子力学)是什么,并提供一个简单的例子来说明它如何应用 ## 帕累托法则(80/20原则) 将(量子力学)最…

喜报 | 知从科技荣获 “AutoSec 安全之星 - 优秀汽车软件供应链安全方案奖”

近日,「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大举行。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办,以汽车“网络数据安全、软件安全、功能安全”为主题,设置了“31X”模式&#xff…

Redis 集群高可用详解及配置

关型数据库 关系型数据库: 是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据 主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库 关型数据库的优缺点 特点: 1、数据关系模型基于关系…

数据管理生态的核心解析:数据库、数据仓库、数据湖、数据平台与数据中台的关系与实现

1. 数据管理的复杂生态 在大数据时代,企业不仅要处理日益增长的海量数据,还需要应对数据类型的多样化。数据可以是结构化的交易数据,也可以是非结构化的日志、社交媒体内容、图像和视频。面对这些挑战,企业必须构建一套能够高效存…

K均值聚类(K Means Cluster)—无监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习

定义 输入: n n n个样本的集合 X X X; 输出:样本集合的聚类 C ⋅ C^{\cdot} C⋅。 (1)初始化。令 t 0 t0 t0,随机选择 k k k个样本点作为初始聚类中心 m ( 0 ) ( m 1 ( 0 ) , ⋯ , m l ( l ) , ⋯ , m k ( 0 ) ) m^{(0)} \big( m_1^{(0)},\cdots,m_l^{(l)},\cdots,m_k^{(0)…

【jvm】记一次hive堆heap内存溢出的排查

先看下java的内存模型 监控jvm工具:visualVM 摘录一下内容: 由c开发的jvm,它巧妙地设计了java的设计理念——即万物皆对象。并设计了这些对象应该如何存储,如何调用,并通过不断迭代设计让对象的存储和回收&#xff0…

[项目][WebServer][读取请求 解析请求]详细讲解

目录 1.ReadLine2.RecvRequest3.ParseRequest4.RecvRequestBody 1.ReadLine 读取的基本单位:按照行来进行读取不同平台,对行分隔符的处理可能不同,所以要有一个函数可以统一处理不同平台的情况,兼容各种行分隔符 \r\n\r\n 本函数…

sqli-labs靶场自动化利用工具——第11关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生,或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢?可能有些人会说不是有sqlmap&#…

无人机动力系统设计基础知识

无人机动力系统设计基础知识 1. 源由2. 组成3. 部件规格3.1 电机规格书1. 电机型号(Model Number)2. 尺寸和重量(Dimensions & Weight)3. Kv 值(Kv Rating)4. 电压范围(Operating Voltage R…

QT 读取Excel表

一、QAxObject 读取excel表的内容&#xff0c;其仅在windows下生效&#xff0c;当然还有其他跨平台的方案。 config qaxcontainer #include <QAxObject>QStringList GetSheets(const QString& strPath) {QAxObject* excel new QAxObject("Excel.Application&…

【前端UI框架】VUE ElementUI 离线文档 可不联网打开

【前端UI框架】VUE ElementUI 离线文档 可不联网打开 Element - The worlds most popular Vue UI framework Element - The worlds most popular Vue UI framework 离线文档下载地址 https://download.csdn.net/download/G971005287W/89742895 文档制作 第一步: 克隆源代码 …

opencv使用videocapture打开视频时,依赖opencv_ffmpeg***.dll,默认必须放到执行目录,自定义目录需要重新编译opencv库

1. 找到modules下opencv_highgui模块的cap_ffmpeg.cpp 2. 找到加载opencv_ffmpeg的接口, 修改接口内opencv_ffmpeg的路径即可.

TCP/IP网络编程概念及Java实现TCP/IP通讯Demo

背景 在当今数字化的世界中&#xff0c;网络通信是连接各种设备和系统的关键。TCP/IP协议作为互联网通信的基石&#xff0c;被广泛应用于各种网络场景。了解TCP/IP网络编程的概念&#xff0c;并掌握如何在Java中实现TCP/IP通讯&#xff0c;对于开发人员来说是非常重要的。 TC…