北京市住房和城乡建设部网站首页/百度数据分析工具
> 🍃 本系列为初阶C++的内容,如果感兴趣,欢迎订阅🚩
> 🎊个人主页:[小编的个人主页])小编的个人主页
> 🎀 🎉欢迎大家点赞👍收藏⭐文章
> ✌️ 🤞 🤟 🤘 🤙 👈 👉 👆 🖕 👇 ☝️ 👍
目录
🐼C++的发展史
🐼命名空间
🐼命名空间的使用
🐼C++输入输出
🐼缺省参数
🐼函数重载
🐼引用
🐼引用的使用
🐼const引用
🐼指针和引用的关系
🐼C++的发展史
🌟C++的起源可以追溯到1979年,当时Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)感受到了面对项目中复杂的软件开 发任务,特别是模拟和操作系统的开发工作,他感受到了现有语言(如C语言)在表达能力、可维护性 和可扩展性方面的不足😑。
于是1983年,Bjarne Stroustrup 在 C语言的基础上添加了面向对象编程 的特性,设计出了C++语言的雏形😄 ,此时的C++已经有了 类、封装、继承 等核心概念,为后来的⾯向对象编程奠定了基础。这⼀年该语言被 正式命名为C++。于是C++的标准化工作于1989年开始,在完成C++标准化的第⼀个草案后不久, STL 被投票包含到C++标准中。⭐️ 于是C++进行了一系列版本更新,如图:![]()
🌟值得肯定的是: C++兼容C语言绝大多数的语法 ,所以C语言实现的程序依旧可以运行, C++中需要把定义文件 代码后缀改为.cpp ,vs编译器看到是.cpp就会调用C++编译器编译,linux下要用g++编译,不再是gcc。
🐼命名空间
✨在C/C++中,会使用到大量变量,函数,类,结构体等。这些变量,函数,类在全局变量中,会引起命名冲突。而在C++中引入了命名空间,就是管理当前标识符的名称进行本地化,以免造成命名冲突。在C++中引入了namespace关键字来解决这种问题。
比如在之前可能遇到这种问题:
int rand = 1; int main() {printf("%d", rand);return 0; }
会显示报错:“rand”: 重定义;以前的定义是“函数”。
这正是由于编译器在库中找到了和全局变量一样的名字,造成报错。
👀那我们应该怎么解决这个问题呢?
这需要使用namespace关键字,使用规则: namespace加命名空间的名字后面跟一对花括号{}。如果我们能改变编译器的查找规则,让编译器从我们定义的域中查找变量,函数,类等。这使namespace定义的域和全局域就相互独立起来了,在不同的域中定义相同的变量,函数,类,结构体等,编译器在查找时,根据命名空间的名字,到对应的空间中查找,就不会造成访问冲突等问题了。本质上,namespace是定义出⼀个域,这个域跟全局域相互独立,不受影响。通过修改编译器的查找逻辑,各个域互不影响。
注意:
1.命名空间域和类域不影响变量生命周期。
2.在项目文件中namespace关键字定义命名空间可以重名,不过编译器认为属于同一块空间。
3.namespace只能定义在全局。支持嵌套定义。
而访问命名空间中的元素,需要使用命名空间名字+::。
在把C++标准库都放到了一个std(standard)的命名空间中:
比如:
namespace li {int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;}; } int main() {printf("%d\n", li::rand);printf("%d\n", li::Add(10, 20));return 0; }
😾解释: 在上述例子中 ,我们定义了一个li的命名空间,里面分别有变量rand,函数Add,结构体。我们通过li::rand来访问在li命名空间中rand变量,以及函数调用。而在这里std::cout和std::endlC++,std是C++标准库的命名空间,具体下面输入输出会讲解。
🐼命名空间的使用
✌️在前面的分享中,我们知道命名空间本质是定义了一个本地域。编译器在查找时,默认会在局部和全局变量中查找,不会到命名空间中查找。所以我们需要掌握命名空间的使用的三种方式:
1.指定命名空间访问。就如刚刚上述例子,li::rand.在项目中推荐,安全性好。
2.使用using将命名空间中全部成员展开。这种方式风险较大,安全性不好,适用于平时练习比较方便。
3.使用using将命名空间中某个成员展开。这种方式取了前两种方式的优点,如果有一个不重名成员频繁使用,可以考虑这种方式。
这里举例:
namespace li {int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;}; } //指定命名空间访问 int main() {printf("%d\n", li::rand);printf("%d\n", li::Add(10, 20));return 0; } //使用using将命名空间中全部成员展开 using namespace li; int main() {printf("%d\n", li::rand);printf("%d\n", li::Add(10, 20));return 0; } //使用using将命名空间中某个成员展开 using li::Add; int main() {printf("%d\n", li::rand);//频繁调用Addprintf("%d\n", li::Add(10, 20));printf("%d\n", li::Add(10, 20));printf("%d\n", li::Add(10, 20));printf("%d\n", li::Add(10, 20));printf("%d\n", li::Add(10, 20));printf("%d\n", li::Add(10, 20));printf("%d\n", li::Add(10, 20));return 0; }
🐼C++输入输出
⭐️ <iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
- std::cin是 istream 类的对象,主要是窄字符的标准输入流。
- std::cout是 ostream 类的对象,主要是窄字符的标准输出流。
- std::endl是一个函数,用于流插入输出,相当于一个换行字符刷新缓存区。
- <<是流插入运算符,>>是流提取运算符
在使用C++输入输出不用指定格式。在C++中输入输出都是自动识别的变量数据类型(本质上是通过函数重载实现的)、
cout,cin,endl都是在属于C++标准库中的,而C++标准库是放在一个std的命名空间中。
在上述我们分享交代了C++使用命名空间的方法。
虽然我们这里没有使用<stdio.h>,但是依旧可以使用printf,scanf,原因是<iostream>
间接包含了。在刚刚的例子中,我们将printf都换成cout。namespace li {int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;}; } //使用using将命名空间中某个成员展开 using li::Add; int main() {std::cout << li::rand << std::endl;//频繁调用Addstd::cout << Add(10,20)<< std::endl; std::cout << Add(10,20)<< std::endl;std::cout << Add(10,20)<< std::endl;std::cout << Add(10,20)<< std::endl;std::cout << Add(10,20)<< std::endl;std::cout << Add(10,20)<< std::endl;std::cout << Add(10,20)<< std::endl;std::cout << Add(10,20)<< std::endl;return 0 ; }
🐼缺省参数
⭐️还是由于在面向对象编程中的不方便,在C++中提出了缺省参数这个概念。
缺省参数是函数声明或定义时为参数指定的一个缺省值。在函数调用时,如果指定了实参,就使用实参,否则,就使用缺省值。
⭐️缺省值分为全缺省和半缺省,全缺省就是所有形参都给缺省值,半缺省就是部分形参给缺省值。在给缺省值时,C++规定,必须从右向左给缺省值,不能跳跃给缺省值。
注意:
缺省值不能在函数声明和定义同时给,只能在函数声明确定缺省值。
缺省值用法:
using namespace std; // 全缺省 void Func1(int a = 10, int b = 20, int c = 30) {cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl; } // 半缺省 void Func2(int a, int b = 10, int c = 20) {cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl; } int main() {Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200, 300);return 0; }
🐼函数重载
⭐️在C++中,支持了同名函数在同一作用域出现,但是要求同名函数的参数不同,可以是参数类型或个数,如果同名函数的返回值不同不能构成重载。比如在之前我们实现计算器,对于加法,可能有整数+整数,浮点数+浮点数等。现在同名函数的调用使用起来就很方便了,这样的做法使得C++使用起来更灵活,这也反映了C++的多态。
int Add(int x, int y) {return x + y; }double Add(double x, double y) {return x + y; } using namespace std; int main() {cout << Add(10, 20) << endl;cout << Add(10.1, 20.1) << endl;return 0; }
🐼引用
⭐️在我们日常生活中,经常会给别人取别名,比如 苏轼,别称包括“东坡居士”、“苏子瞻”、“苏洵之子”等,东坡居士是苏轼,苏子瞻是东坡居士,苏洵之子是苏子瞻,他们都是苏轼。但对他的别名都是苏轼这个人,没有其他人。在C++中,引入了引用这个概念,引用是给变量取别名,并没有定义一个新变量,也没有创建新的空间。类型& 引用别名 = 引用对象;这里&和C语言取地址操作符是一样的,但是含义完全不同,大家要区别开比如:using namespace std; int main() {int a =10;int& ra = a;int& rra = a;int& rrra = a;//ra rra rrra地址完全相同cout << &ra << endl;cout << &rra << endl;cout << &rrra << endl;int x = 0;int& b = x;int& c = b;int& d = c;++d;cout << &x << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;cout << x << " " << b << " " << c << " " << endl;return 0; }
这里x,b,c,d都是同一片空间。
🐼引用的使用
- 首先,需要注意,引用一旦引用了一个实体,就不能引用其他实体。
- 可以有多个引用引用同一个变量。
- 引用在定义时必须初始化。
例:
#include<iostream> using namespace std; int main() {int a = 10;// 编译报错:“ra”: 必须初始化引⽤//int& ra;int& b = a;int c = 20;// 这并不是让b引用c,因为C++引用不能改变指向,// 这是⼀个赋值,相当于给a指向的空间赋值b = c;cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << b << endl;cout << c << endl;cout << a << endl;return 0; }
🍏引用在使用时主要有两种用途,引用传参或引用作返回值。 优点:减少拷贝提高效率和改变引用对象时同时改变被引用对象。
引用传参跟指针传参功能是类似的,引用传参相对更方便⼀些。
比如在交换两个数的值,在C语言需要取地址,使用指针。在C++中,引用这方面用起来方便多了。
using namespace std; void Swap(int& rx, int& ry) {int tmp = rx;rx = ry;ry = tmp; } int main() {int x = 0, y = 1;cout << x << " " << y << endl;Swap(x, y);cout << x << " " << y << endl;return 0; }
我们在之前不带头单链表创建时形参是这样的:
void ListPushBack(LTNode** phead, int x)
test.cpp LTNode* plist = NULL; ListPushBack(plist,1);
typedef struct ListNode { int val; struct ListNode* next; }LTNode, *PNode; // 指针变量也可以取别名,这⾥LTNode*& phead就是给指针变量取别名 // 这样就不需要⽤⼆级指针了,相对⽽⾔简化了程序 void ListPushBack(LTNode** phead, int x) void ListPushBack(LTNode*& phead, int x)
1.我们这里可以拆开来看,首先,变量可以拿来引用,那么,指针也可以拿来引用。引用plist的指针,形参可以用LTNode*& phead来接收,其中,LTNode*是phead引用的类型。就像引用int&b = a(int为a的类型)。
2.这里用typedef简写了结构体指针*PNode,这表示指向结构体的指针,等价于LTNode*
最后,也可以写作:void ListPushBack(PNode& phead, int x);
🐼const引用
🍊在引用时,我们可能会触碰以下情形:
比如:int& rb = a*3; double d = 12.34; int& rd = d;在这些场景下,如10,a*3,12.34都保存在一个临时对象(临时对象:编译器需要把一个空间暂存表达式的结果放在一个未命名的对象中)中,而对于int& rd = d发生类型转换,也是需要借助临时变量C。而C++规定临时对象具有常性,不能修改,所以这里就触发了权限放大,必须要用常引用才可以。如果引用对象是需要放在临时变量就有常性的,都需要我们使用常引用,权限可以平行或缩小,权限不能放大。
int main() {//权限放大,无法从“const int”转换为“int &”const int a = 10;//int& ra = a;//正确示范:const int& ra = a;// 编译报错:error C3892: “ra”: 不能给常量赋值//ra++;// 这⾥的引用是对b访问权限的缩小int b = 20;const int& rb = b;// 编译报错:error C3892: “rb”: 不能给常量赋值//rb++;//权限不能放大const int* pa = &a;//int* pb = &a;//权限可以缩小int* pc = &b;const int* ppc = pc;return 0; }
🐼指针和引用的关系
🍒在c++中,指针和引用的使用是紧密相关,不可分割的。
语法上:
引用在定义时必须初始化,指针建议初始化,但不必须。
引用一旦有了实体,就不可以再指向其他实体,但是指针可以不断地指向其他对象。
引用可以直接访问指向对象,指针需要解引用才是访问指向对象。
指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全一些。
引用是一个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。 sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个byte,64位下是8byte)。在汇编层:
指针和引用的实现本质上是一样的。
int main() {int a = 10;int* pa = &a;int b = 10;int& d = b;return 0; }
感谢你看到这里,如果觉得本篇文章对你有帮助,点个赞👍 吧,你的点赞就是我更新的最大动力。⛅️🌈 ☀️
相关文章:

【C++】新手入门指南
> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 …...

C++使用开源ConcurrentQueue库处理自定义业务数据类
ConcurrentQueue开源库介绍 ConcurrentQueue是一个高性能的、线程安全的并发队列库。它旨在提供高效、无锁的数据结构,适用于多线程环境中的数据交换。concurrentqueue 支持多个生产者和多个消费者,并且提供了多种配置选项来优化性能和内存使用。 Conc…...

在vue3的vite网络请求报错 [vite] http proxy error:
在开发的过程中 代理proxy报错: [vite] http proxy error: /ranking/hostRank?dateType1 Error: connect ETIMEDOUT 43.xxx.xxx.xxx:443 网络请求是http的: // vite.config.ts import { Agent } from node:http;server: {host: 0.0.0.0,port: port,open: true,https: false,…...

ElasticSearch 简单的查询。查询存在该字段的资源,更新,统计
1.查询存在该字段的数据 {"query": {"bool": {"must": [{"exists": { "field": "chainCode"}}],"must_not": {"exists": {"field": "isDelete"}}}} } 备注:…...

FOFA使用教程之从零到精通
FOFA使用教程之从零到精通 前言一、关于网络资产测绘的概念1、啥是网络空间资产测绘2、啥是互联网资产二、FOFA的简要介绍1、FOFA地址是啥?2、关于FOFA的简要介绍三、FOFA精讲1、运算符规则详解① 关于 = 号的使用说明② 关于 == 号的使用说明③ 关于 && 号的使用说明…...

【提高篇】3.2 GPIO(二,基本结构)
目录 一,GPIO的基本结构 二,保护二极管 三,上拉、下拉电阻 四,施密特触发器 五,P-MOS 管和 N-MOS 管 P-MOS管和N-MOS管的区别 六,片上外设 七,IDR,ODR,BSRR寄存器 7.1 IDR(Input Data Register) 7.2 ODR(Output Data Register) 7.3 BSRR(Bit Set/Rese…...

UE hard/soft reference| DDX DDY | Unity pcg color
目录 1.虚幻引擎性能优化 (附0跳转Unity对应机制) hard reference and soft reference 1. 硬引用(Hard Reference) 2. 软引用(Soft Reference) 3. 使用原则 2.空间梯度转法线 DDX DDY节点 编辑 …...

macOS 应用公证指南:使用 fastlane 实现自动化公证流程
背景介绍 在 macOS 系统上,为了保护用户安全,Apple 要求开发者对未通过 Mac App Store 分发的应用程序进行公证(Notarization)。如果应用程序没有经过公证,用户在运行时会看到警告弹窗,这会影响用户体验。虽然开启沙箱模式的应用可以直接通过 App Store 分发来避免这个问题…...

深度学习:解密图像、音频和视频数据的“理解”之道20241105
🔍 深度学习:解密图像、音频和视频数据的“理解”之道 深度学习已然成为人工智能领域的中流砥柱,它如何处理不同类型的数据(如图像、音频、视频)?如何将这些数据转换成计算机能理解和学习的“语言”&#…...

uniapp 实现瀑布流
效果演示 组件下载 瀑布流布局-waterfall - DCloud 插件市场...

计算机毕业设计 | springboot+vue智慧工地管理系统 前后端分离后台管理(附源码+文档)
1,项目介绍 管理信息是重要的资源、管理信息是决策的基础。同时管理信息是实施管理控制的依据以及是联系组织内外的纽带。对于企业,最重要的5大资源包括人、物资、能源、资金、信息。人、物资、能源、资金是可以看见的有形资源,信息则是一种…...

vue中html如何转成pdf下载,pdf转base64,忽略某个元素渲染在pdf中,方法封装
一、下载 html2Canvas jspdf npm install jspdf html2canvas二、封装转换下载方法 htmlToPdf.js import html2Canvas from html2canvas import JsPDF from jspdf/*** param {*} reportName 下载时候的标题* param {*} isDownload 是否下载默认为下载,传false不…...

Ubuntu下如何管理多个ssh密钥
Ubuntu下如何管理多个ssh密钥 前言 我一直在逃避这个问题,误以为我能够单纯地用一个 ssh 走天下。 好吧,现实是我不得不管理多个 ssh 做,那就写个博客总结一下吧。 查阅后发现前人已经总结了不少,那我就结合之后ÿ…...

[vulnhub] DarkHole: 1
https://www.vulnhub.com/entry/darkhole-1,724/ 端口扫描主机发现 探测存活主机,184是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 09:59 CST Nmap scan report for 192.168.75.1 Host is up (0.00027s latency). MA…...

商淘云连锁企业管理五大功能 收银系统助力门店进销存同步
连锁企业管理的五大功能相互协作,共同确保连锁门店能够高效运营、降低成本、提升客户满意度,并最终实现盈利目标。今天,商淘云分享连锁企业管理的五大功能: 1、进销存管理:进销存管理是连锁企业的基础功能之一…...

统信UOS开发环境支持Perl
UOS凭借广泛的编程语言支持,为开发者构建了一个高效灵活的开发环境,无需担心环境兼容性问题。 文章目录 一、环境部署1. Perl开发环境安装2. Perl开发环境配置环境变量配置模块管理器编辑器集成调试工具二、代码示例文件处理Web开发三、常见问题1. 依赖管理问题2. 性能问题3.…...

Stable Diffusion Web UI - ControlNet 姿势控制 openpose
openpose 是 ControlNet 中常用的控制模式之一。 通过 openpose 可以锁定人物姿势,把姿势信息传递给 Stable Diffusion 扩散模型,让其在扩散生成图片的时候遵照特定的任务姿势。 通过 openpose 能够得到类似如下效果: 同样的姿势࿰…...

java中Json字符串转换
文章目录 map与json互转map转jsonmap形式的json转map list与json互转list转jsonlist形式的json转list map形式的json串中含有列表转列表 map与json互转 map转json JSONObject.toJSONString(map); public static void main(String[] args) {Map<String, Object> map n…...

springboot处理跨域请求
在Spring Boot中处理跨域请求(CORS, Cross-Origin Resource Sharing)通常有几种方法。跨域请求是指从一个域名的网页去请求另一个域名下的资源。为了安全起见,浏览器会阻止这种请求,除非服务器明确允许。 方法一:使用…...

S32G-VNP-RDB2开发环境搭建
下载官方镜像 刷机 cat /proc/partition or df -lh //查看sdcard卡再/dev目录挂在点 export DEVSD/dev/sdb sudo dd iffsl-image-auto-s32g274ardb2.sdcard of${DEVSD} bs1M && sync以上将SD-card插入就可以将开发板启动,串口接UART1,进入Lin…...

分布式唯一ID生成(二): leaf
文章目录 本系列前言号段模式双buffer优化biz优化动态step源码走读 雪花算法怎么设置workerId解决时钟回拨源码走读 总结 本系列 漫谈分布式唯一ID分布式唯一ID生成(二):leaf(本文)分布式唯一ID生成(三&am…...

【开发工具】Git
目录 核心概念基本命令工作流程Commit message Git 是一个分布式版本控制系统,用于跟踪在软件开发过程中对文件的修改。它允许多个开发者协作处理项目,并且可以有效地管理代码的历史记录。以下是 Git 的一些核心概念和功能: 核心概念 仓库 (R…...

【go从零单排】结构嵌套struct embedding
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在Go语言中,结构体嵌套(struct embedding)是一…...

Django 详细入门介绍
Django 详细入门介绍 1. 什么是 Django? Django 是一个开源的、用 Python 编写的 Web 框架。它遵循了“快速开发”和“不要重复自己”(DRY)的设计原则,旨在简化复杂的 Web 开发。Django 提供了多种强大的功能模块,如…...

万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总万字长文解读…...

HDR视频技术之二:光电转换与 HDR 图像显示
将自然界中的真实场景转换为屏幕上显示出来的图像,往往需要经过两个主要的步骤:第一个是通过摄影设备,将外界的光信息转换为图像信息存储起来,本质上是存储为数字信号;第二个是通过显示设备,将图像信息转换…...

【Linux】Linux入门实操——vim、目录结构、远程登录、重启注销
一、Linux 概述 1. 应用领域 服务器领域 linux在服务器领域是最强的,因为它免费、开源、稳定。 嵌入式领域 它的内核最小可以达到几百KB, 可根据需求对软件剪裁,近些年在嵌入式领域得到了很大的应用。 主要应用:机顶盒、数字电视、网络…...

Redis的缓存问题与应对策略
Redis 作为一种高效的缓存系统,在高并发环境下应用广泛,但也面临一些缓存问题,以下是常见问题及其应对策略。 1. 缓存穿透 问题描述 缓存穿透是指请求的数据在缓存和数据库中都不存在,但大量请求直接到达数据库,从而给…...

Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着科技的飞速发展,人们的…...

每日一题之成绩排序
在N(N<30)名运动员参加的体操比赛中,有K(K<10)名裁判给每位运动员分别打分, 按规则每名运动员最后得分需去掉一个最高分和一个最低分, 然后把其他裁判的打分相加,计算得出该运…...