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

【C++】C到C++的入门知识

目录

1、C++关键字

2、命名空间

2.1 命名空间的定义

2.2 命名空间的使用

2.2.1 加命名空间名称及作用域限定符

2.2.2 使用using将命名空间中某个成员引入

2.2.3 使用using namespace 命名空间名称引入

3、C++输入&输出

4、缺省参数

 4.1 缺省参数的概念

4.2 缺省参数的分类

4.2.1 全缺省参数

4.2.2 半缺省参数

5、函数重载

5.1 函数重载概念

5.1.1 在同一作用域中 

5.1.2 参数类型不同

5.1.3 参数个数不同

5.1.4 参数顺序不同

5.2 C++如何支持函数重载?为什么C语言不支持?

6、引用

6.1 引用的概念

6.2 引用特性

6.3 常引用

6.4 使用场景

6.4.1 做参数

6.4.2 做返回值

​编辑

6.4.3 引用做参数和做返回值提高效率对比

6.4.4 引用和指针的区别

7、内联函数

7.1 概念

 7.2 特性

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

8.1 auto简介

8.2 auto的使用规则

8.3 auto不能推导的情景

9、基于范围的for循环(C++11)

9.1 范围for的语法

9.2 范围for的使用条件

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


1、C++关键字

C++关键字有63个,C语言关键字有32个

2、命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存
在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或命名污染,namespace关键字的出现就是为了解决这个问题。

此时会报错,因为头文件<cstdlib>中包含了rand函数,而在全局变量中又有rand变量,命名冲突了(注意,这里如果把rand定义为局部变量,则不会报错,因为局部优先)

2.1 命名空间的定义

namespace+命名空间的名字+{},{}中就是命名空间的成员。

在命名空间中,可以定义变量,函数,类型,命名空间

注意,一个工程中允许出现多个名字相同的命名空间,若这些命名空间中没有名字相同的变量,则编译器最后会合成到同一个命名空间中,若这些命名空间中有相同名字的变量,则编译时会报错

2.2 命名空间的使用

2.2.1 加命名空间名称及作用域限定符

2.2.2 使用using将命名空间中某个成员引入

此时是将命名空间中某个变量、函数、类型、命名空间展开

2.2.3 使用using namespace 命名空间名称引入

此时时间整个命名空间中的所有东西展开

编译器默认查找:

a. 当前局部域

b. 全局域

c. 到展开的命名空间中

在不指定命名空间的情况下,查找顺序是a->b==c,在其中一个找到后,就不会再往后寻找,若指定了命名空间,则直接取命名空间中寻找

所以若将命名空间整个展开,且全局变量中有与这个命名空间中相同的内容,会报错

而若是两个命名空间中有相同的内容,且都展开了,那么就会报错

定义了命名空间,就是创建了命名空间域

全局域和局部域会影响变量的生命周期

命名空间域不会影响变量的生命周期(在命名空间中的变量是全局变量),只是限定了域(影响了编译器的查找规则,因为正常情况下只会有上面的a、b两点)

注意,展开命名空间不等于展开头文件,展开命名空间是影响了编译器的查找规则,相当于加了声明 

若要修改命名空间中的值,需要在主函数中修改,不能在主函数外修改,这一点与全局变量相同

C++库中的所有东西都放在std库中

补充一个题外话,在局部优先的情况下,若想要使用全局变量,可以在变量前加::

3、C++输入&输出

C++输入使用cin,输出使用cout,换行使用endl,他的都定义在std标准库中

头文件都是iostream

同时,C语言的scanf,printf,\n,都是可以使用的

stdio.h包含在iostream中

4、缺省参数

 4.1 缺省参数的概念

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

4.2 缺省参数的分类

4.2.1 全缺省参数

4.2.2 半缺省参数

注意:

a. 半缺省参数必须从左向右依次给出,不能间隔给出

b.给含有缺省参数的函数传值时,必须按顺序传,不能跳着传

c.缺省参数不能在函数声明和定义中同时出现。通常是在函数定义时不给缺省参数,而在函数声明时给出

d.缺省参数必须是常量或全局变量

对于上面c的解释 

5、函数重载

5.1 函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

5.1.1 在同一作用域中 

此时不构成函数重载,因为两个函数不在同一作用域中,他们在不同的命名空间域中

就算把N1、N2都展开,任然不是函数重载,因为任然不是在同一作用域中,展开不是变成全局变量,而是让编译器可以到里面去找

5.1.2 参数类型不同

5.1.3 参数个数不同

5.1.4 参数顺序不同

函数重载对返回值是没有要求的,即只要满足三个的其中一个,且在同一作用域中,不管返回值是否相同都可以构成函数重载,但若只有返回值不同是不能构成函数重载的

5.2 C++如何支持函数重载?为什么C语言不支持?

想要了解这个问题,需要先了解代码编译链接的过程,以C语言代码为例

问题就出现在链接的过程中

6、引用

6.1 引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

 通过引用,还可以将之前的单链表做修改

6.2 引用特性

a. 引用在定义时必须初始化

b. 一个变量可以有多个引用

c. 引用一旦引用一个实体,就不能再引用其他实体

6.3 常引用

引用时,变量的访问权限可以缩小,不能放大 

 除了引用有权限缩小放大的规则外,指针也有

注意,权限放大和缩小对于整型

这里说明一下const int*和int* const

const int* p: 表示p是指向const int类型的指针,即p所指向的内存空间的值不能被修改,但是指针p本身是可以被修改的

int* const p: 表示p是指向int类型的const指针,即指针p本身不能被修改,但是指针p所指向的内存空间的值可以被修改

 

6.4 使用场景

6.4.1 做参数

作用:a. 输出型参数

           b. 提高效率

6.4.2 做返回值

传值返回是创建一个临时变量返回

传引用返回是直接返回引用

作用:a. 少创建一个临时变量,提高效率

           b. ...

 在上面的代码中,为什么返回值要用static修饰呢?我们可以先看几段代码

这段代码是正常的

 若加上static

总结:一个函数要使用引用返回,返回变量出了这个函数的作用域还存在,就可以使用引用返回,否则就不安全,即全局变量、静态变量等

6.4.3 引用做参数和做返回值提高效率对比

a.引用做参数

 

b. 引用做返回值

6.4.4 引用和指针的区别

在语法概念上,引用就是一个别名,没有独立空间,和其引用的实体共用同一块空间,在底层实现上,实际是有空间的,因为引用是按照指针的方式来实现的

可以看一下反汇编

 引用与指针的不同点:

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全

7、内联函数

7.1 概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。


 

 7.2 特性

1、inline是一种以空间换时间的做法,省去了调用函数的开销。所以代码很长(一般20行以内)或有循环或递归的函数不适宜使用内联函数

2、inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数内有循环递归等,编译器优化时会自动忽略内联

3、inline不建议声明和定义分离,分离会导致链接错误,因为inline展开就没有函数地址了,链接时就会找不到。

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

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

8.1 auto简介

C++11中,auto作为一个新的类型指示符来指示编译器,auto声明的变量必须是编译器在编译时推导而得

注意:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

8.2 auto的使用规则

 a. auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但auto声明引用类型时必须加&

b.在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译
器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

8.3 auto不能推导的情景

a.auto不能做函数的参数

b. auto不能直接用来声明数组

c. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

d. auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有
lambda表达式等进行配合使用。

9、基于范围的for循环(C++11)

9.1 范围for的语法

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因
此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范
围内用于迭代的变量,第二部分则表示被迭代的范围。

此时是不正确的,因为第一个for里面的e是数组中元素的拷贝,若要实现将数组中每个值都翻倍,因为要让e变成数组中元素的引用

与普通循环类似,可以使用continue来结束本次循环,也可以使用break来跳出整个循环

9.2 范围for的使用条件

a. for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供
begin和end的方法,begin和end就是for循环迭代的范围。

b. 范围for只能从头到尾遍历

c. 迭代对象要实现++和==的操作

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

a.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入

b. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
c. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

相关文章:

【C++】C到C++的入门知识

目录 1、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入 2.2.3 使用using namespace 命名空间名称引入 3、C输入&输出 4、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的…...

【c++】简单的日期计算器

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们本节内容来完成知识的实践&#xff0c;来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…...

基于easyx库的C/C++游戏编程实例-飞机大战

飞机大战游戏设计 首先创建飞机/子弹结构&#xff1a; struct Plane {int x;int y;bool live;int width;int height;int type;int hp; }player,bul[BUL_NUM],enemy[ENE_NUM];你需要加载图片&#xff1a; void ImageLoad() {//背景loadimage(&bg[0], "./image/飞机大…...

stitcher类实现多图自动拼接

效果展示 第一组&#xff1a; 第二组&#xff1a; 第三组&#xff1a; 第四组&#xff1a; 运行代码 import os import sys import cv2 import numpy as npdef Stitch(imgs,savePath): stitcher cv2.Stitcher.create(cv2.Stitcher_PANORAMA)(result, pano) stitcher.st…...

Ubuntu下udp通信

一、知识准备阶段 socket是什么&#xff1f;套接字是什么&#xff1f; https://blog.csdn.net/m0_37925202/article/details/80286946 Socket程序从Windows移植到Linux下的一些注意事项 sockaddr和sockaddr_in详解 bzero和memset函数 函数原型&#xff1a;void bzero&…...

拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)

前言: 实战开整 目前而言对于整个拌合楼管理软件开发,因为公司对这个项目还处于讨论中,包括个人对其中的商业逻辑也存在一些质疑,都是在做一些技术上的储备.很早就写好了串口与地磅对接获取代码,也大概知道真个逻辑,这次刚好跟库区沟通,远程连接到磅房电脑,开始实操一下. 一、地…...

FastAPI+React全栈开发10 MongoDB聚合查询

Chapter02 Setting Up the Document Store with MongoDB 10 Aggregation framework FastAPIReact全栈开发10 MongoDB聚合查询 In the following pages, we will try to provide a brief introducton to the MongoDB aggregation framework, what it is, what benefits it of…...

python 报错问题汇总

error: [WinError 32] 另一个程序正在使用此文件&#xff0c;进程无法访问。: d:\\anaconda\\envs\\yolov5\\lib\\site-packages\\ISR-2.2.0-py3.7.egg 解决方法&#xff1a;重启pycharm python-contrib 无法安装 opencv-contrib-python 安装包网址&#xff1a;安装包下载链接…...

6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LCD使用 简介 AIO-3399J开发板外置了两个LCD屏接口&#xff0c;一个是EDP&#xff0c;一个是LVDS&#xff0c;接口对应板…...

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是&#xff08;&#xff09;。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…...

【算法】基数排序

简介 基数排序&#xff08;*Radix sort&#xff09;是一种非比较排序算法&#xff08;non-comparative sorting algorithm&#xff09;。现代计算机的基数排序算法由 计数排序 算法的开发人哈罗德H西华德&#xff08;Harold H. Seward&#xff09;于1954年于麻省理工大学开发。…...

2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;轻量2核2G3M带宽、40系统盘&#xff0c;云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图&#xff1a;…...

不同Python版本和wxPython版本用pyinstaller打包文件大小对比

1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统&#xff0c;所以我仅筛选3.6-3.8之间的版本…...

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问&#xff08;两种方式&#xff09; 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明&#xff08;匿…...

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)

AI时代-普通人的AI绘画工具对比&#xff08;Midjouney与Stable Diffusion&#xff09; 前言1、基础对比Stable Diffusion&#xff08;SD&#xff09;SD界面安装与使用SD Midjouney&#xff08;MJ&#xff09; 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…...

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1&#xff09;题目描述&#xff1a; 求A^B的最后三位数表示的整数&#xff0c;A^B表示&#xff1a;A的B次方。 2&#xff09;思路&#xff1a; 一般的思路是&#xff1a;求出A的B次幂&#xff0c;再取结果的最后三位数。但是由于计算机能够表示的数字…...

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…...

【Hello,PyQt】QTextEdit和QSplider

PyQt5 是一个强大的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。其中&#xff0c;QTextEdit 控件作为一个灵活多用的组件&#xff0c;常用于显示和编辑多行文本内容&#xff0c;支持丰富的格式设置和文本操作功能。另外&#xff0c;QSlider 控件是一…...

【力扣】191.位 1 的个数、485.最大连续 1 的个数

191.位 1 的个数 题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1…...

蓝桥杯 java 承压计算

题目: 思路&#xff1a; 1&#xff1a;其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2&#xff1a;假设每块原料的重量都十分精确地平均落在下方的两个金属块上&#xff0c;最后&#xff0c;所有的金属块的重量都严格精确地平分落在最底层的电子…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...