【C++】初识C++

news2024/11/19 23:35:47

本期博客我们来正式进入到期待已久C嘎嘎的学习

希望C语言以后别给我打电话了,我怕C++误会😼

一、认识C++

1. 什么是C++

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言 应运而生。

1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而 产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的 程序设计,还可以进行面向对象的程序设计。

2. C++的发展史

1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C 语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。

📋语言的发展就像是练功打怪升级一样,也是逐步递进,由浅入深的过程。我们先来看下C++的历 史版本。

阶段

内容

C with classes

类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符 重载等

C++1.0

添加虚函数概念,函数和运算符重载,引用、常量等

C++2.0

更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静 态成员以及const成员函数

C++3.0

进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处 理

C++98

C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美 国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)

C++03

C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性

C++05

C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名 C++0x,即:计划在本世纪第一个10年的某个时间发布

C++11

增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循 环、auto关键字、新容器、列表初始化、标准线程库等

C++14

对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表 达式,auto的返回值类型推导,二进制字面常量等

C++17

在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文 本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等

C++20

自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协 程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有 特性的更新:比如Lambda支持模板、范围for支持初始化等

C++23

制定ing

C++还在不断的向后发展。但是:现在公司主流使用还是C++98和C++11,所以大家不用追求最 新,重点将C++98和C++11掌握好,等工作后,随着对C++理解不断加深,有时间可以去琢磨下更 新的特性。

3. C++的语言流行度

❗注意:排名不能说明那个语言好,那个不好,每门编程语言都有适应自己的应用场景。

4. 在工作领域的C++

1. 操作系统以及大型系统软件开发 所有操作系统几乎都是C/C++写的,许多大型软件背后几乎都是C++写的,比如: Photoshop、Office、JVM(Java虚拟机)等,究其原因还是性能高,可以直接操控硬件。

2. 服务器端开发 后台开发:主要侧重于业务逻辑的处理,即对于前端请求后端给出对应的响应,现在主流采 用java,但内卷化比较严重,大厂可能会有C++后台开发,主要做一些基础组件,中间件、 缓存、分布式存储等。服务器端开发比后台开发跟广泛,包含后台开发,一般对实时性要求 比较高的,比如游戏服务器、流媒体服务器、网络通讯等都采用C++开发的。

3. 游戏开发 PC平台几乎所有的游戏都是C++写的,比如:魔兽世界、传奇、CS、跑跑卡丁车等,市面上 相当多的游戏引擎都是基于C++开发的,比如:Cocos2d、虚幻4、DirectX等。三维游戏领 域计算量非常庞大,底层的数学全都是矩阵变换,想要画面精美、内容丰富、游戏实时性 搞,这些高难度需求无疑只能选C++语言。比较知名厂商:腾讯、网易、完美世界、巨人网 络等。 4. 嵌入式和物联网领域 嵌入式:就是把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,能够控制这些 装置。比如:智能手环、摄像头、扫地机器人、智能音响等。 谈到嵌入式开发,大家最能想到的就是单片机开发(即在8位、16位或者32位单片机产品或者 裸机上进行的开发),嵌入式开发除了单片机开发以外,还包含在soc片上、系统层面、驱动 层面以及应用、中间件层面的开发。 常见的岗位有:嵌入式开发工程师、驱动开发工程师、系统开发工程师、Linux开发工程 师、固件开发工程师等。 知名的一些厂商,比如:以华为、vivo、oppo、小米为代表的手机厂;以紫光展锐、乐鑫为 代表的芯片厂;以大疆、海康威视、大华、CVTE等具有自己终端业务厂商;以及海尔、海 信、格力等传统家电行业。 随着5G的普及,物联网(即万物互联,)也成为了一种新兴势力,比如:阿里lot、腾讯lot、京 东、百度、美团等都有硬件相关的事业部。

5. 数字图像处理 数字图像处理中涉及到大量数学矩阵方面的运算,对CPU算力要求比较高,主要的图像处理 算法库和开源库等都是C/C++写的,比如:OpenCV、OpenGL等,大名鼎鼎的Photoshop 就是C++写的。

6. 人工智能 一提到人工智能,大家首先想到的就是python,认为学习人工智能就要学习python,这个 是误区,python中库比较丰富,使用python可以快速搭建神经网络、填入参数导入数据就 可以开始训练模型了。但人工智能背后深度学习算法等核心还是用C++写的。

7. 分布式应用 近年来移动互联网的兴起,各应用数据量业务量不断攀升;后端架构要不断提高性能和并发 能力才能应对大信息时代的来临。在分布式领域,好些分布式框架、文件系统、中间组件等 都是C++开发的。对分布式计算影响极大的Hadoop生态的几个重量级组件:HDFS、 zookeeper、HBase等,也都是基于Google用C++实现的GFS、Chubby、BigTable。包括分 布式计算框架MapReduce也是Google先用C++实现了一套,之后才有开源的java版本。 除了上述领域外,在:科学计算、浏览器、流媒体开发、网络软件等都是C++比较适合的场景, 作为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值。

5. 如何学习C++

学习C语言需要多敲代码,学习数据结构需要多画图+敲代码,那学习C++呢?

C++是我们长期积累的过程,一般人想要达到精通C++的程度至少需要10年的经验。对于我们来说建议不要把精通C++作为一个一年目标,应该要把学习语言作为一个持续的过程,同时要把 语言运用在具体的应用场合中。

在这里推荐一本初学C++的好书:《Effective C++》

下面我们正式来进入到C++的学习:

二、C++入门

2.1 C++兼容C语言的语法

📋首先我们创建一个.cpp的源文件,在这里输入一些C语言的语法:

这里是完全可以运行的,说明C++是兼容C语言的(只兼容C语言的90%不是完全兼容,在后期有差异的地方我们会谈到)

2.2 C++关键字(C++98)

C++总计63个关键字,C语言32个关键字 📋下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解,后面我们学到以后再 细讲。

asm

continue

export

int

public

short

unsigned

auto

class

else

if

reinterpret_cast

try

using

bool

do

extern

long

return

typedef

wchar_t

break

double

false

mutable

sizeof

typeid

virtual

case

dynamic_cast

float

new

static

typename

void

catch

delete

for

namespace

static_cast

throw

volatile

char

default

friend

operator

struct

template

register

const

enum

goto

protected

switch

this

true

const_cast

explicit

inline

private

signed

union

while

2.3 命名空间

📋在C语言中我们可能会遇到这样的情况:

在这种情况下,我们定义的变量与头文件中库函数的名子发生了冲突,代码编译不过去。

这种情况不仅仅会出现在库函数中,当我们工作时,一个项目可能需要多个程序员编写,在最后将代码整合时,不可能避免每个程序员的定义命名不重复。

📋再例如这种情况:

我们在定义队列和链表时命名节点结构体时是相同的,这也会造成命名的冲突:

在C++中为了避免这种情况,引入了命名空间

2.3.1 namespace

📌关键字:

namespace

我们可以使用namespace来定义一个局部的命名作用域

具体操作:namespace 局部作用域的名字 {想要作用的区域}

📋下面来进行举例操作:

我们在各自的头文件中加上两个命名空间Q和L,这样两个相互定义的Node结构体就不会发生命名冲突了:

2.3.2 加命名空间名称及作用域限定符 来访问命名空间

在上述情况下我们在主函数中想要直接使用Node是不可以的:

我们需要使用::(作用域限定符)来确定我们要使用的Node所声明的命名空间

具体操作:想要访问的命名空间名称 :: 命名空间里定义的变量

📋举个栗子:

2.3.3 命名空间的嵌套

和结构体一样,命名空间里可以再嵌套命名空间

当很多员工都使用命名空间时,不排除命名空间的名称相同的可能性,对于相同名字的命名空间编译代码时会将其整合到一起

📋例如以下情况:

现在有两个相同名字的命名空间,这样还是会发生命名冲突:

对于这种情况我们可以嵌套命名空间来解决,将Queue头文件里的Node在嵌套一个命名空间B:

这样就可以很好的避免了命名空间名字一样的情况:


本期博客到这里又要结束啦~

下期将给大家带来满满的C++上的干货,请各位准备好脑子进行更深入的学习~

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

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

相关文章

蓝奥声无线单火控制技术在单火开关应用中的优势

随着科技的发展,智能产品在生活中越来越常见,为方便业主使用,就连开关也有了高阶智能版,据相关专家介绍,智能开关主要分为单火和零火两种,很多非专业人士搞不明白,但又害怕因此选择失误。那么&a…

关于微服务的一些总结和经验之谈,来看看你都了解吗

文章目录一 谈谈对微服务的理解1. 什么微服务?2. 微服务体系3. 微服务优点4. 微服务缺点5. 什么是gRPC?6. ProtoBuf协议好处?7. gPRC和ProtoBuf联系?二 本次微服务项目学习流程梳理三 微服务项目一般开发流程梳理四 从本次微服务项…

数据结构 | 图结构的讲解与模拟实现 | DFS与BFS的实现

文章目录前言常见概念总结图的模拟实现邻接矩阵和邻接表的优劣图的模拟实现(邻接表)广度优先遍历(BFS)深度优先遍历(DFS)前言 在聊图的结构之前,我们可以先从熟悉的地方开始,这有一…

Leetcode 剑指 Offer II 012. 左右两边子数组的和相等

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给你一个整数数组 nums ,请计算数组的 中心下标 。 …

Android 启动速度优化

Android 启动速度优化前序统计adb测量手动打点方案预加载class字节码的预加载Activity预创建Glide预初始化WebView预加载数据预加载三方库初始化布局方面ViewStub标签减少层级主题的选择约束布局使用X2C方案过度绘制如何检测过度绘制如何监控页面的渲染速度移除多余背景Recycle…

Linux系列 Linux常用命令(2)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.Linux常用命令后续 1.创建目录和文件 (1&#x…

DaVinci:Camera Raw(Blackmagic RAW)

本文主要介绍 Blackmagic Raw 格式(.braw)素材相关的 Camera Raw 参数。解码质量Decode Quality解码质量决定了图像解拜耳之后所呈现的素质。默认为“使用项目设置” Use project setting,表示使用项目设置对话框中的“Camera RAW”解码质量设…

PPT录制视频的方法有哪些?分享5种亲测好用的方法

PPT文稿可以通过图文或者动画的形式,直观形象地把内容展现给观众,从而给观众留下深刻的印象。比如老师讲课时会用到PPT,公司开会时也会用到PPT。除了需要使用到PPT文稿之外,有时还要对它进行录制。那你知道PPT录制视频的方法有哪些…

[JavaWeb]HTML

目录1.简介1.1 HTML基本结构1.2 标签使用细节2.常用标签使用2.1 font 字体标签2.2 字符实体2.3 标题标签2.4 超链接标签2.5 有序无序标签(1)无序列表ul/li(2)有序列表ol/li2.6 图像标签(img)2.7 表格(table)标签表格标签-跨行跨列表格2.8 form(表单)标签介绍2.9 input单选多选标…

Unity-ROS与Navigation 2(四)

0. 简介 对于Gazebo而言,我们知道其是可以通过与ROS的连接完成机器人建图导航的,那我们是否可以通过Unity来完成相同的工作呢,答案是肯定的。这一讲我们就来讲述使用Unity的“Turtlebot3”模拟环境,来运行ROS2中的“Navigation 2…

Rust机器学习之tch-rs

Rust机器学习之tch-rs tch-rs是PyTorch接口的Rust绑定,可以认为tch-rs是Rust版的PyTorch。本文将带领大家学习如何用tch-rs搭建深度神经网络识别MNIST数据集中的手写数字。 本文是“Rust替代Python进行机器学习”系列文章的第五篇,其他教程请参考下面表…

autodeauth:一款功能强大的自动化Deauth渗透测试工具

关于autodeauth autodeauth是一款功能强大的自动化Deauth渗透测试工具,该工具可以帮助广大研究人员以自动化的形式针对本地网络执行Deauth渗透测试,或者枚举公共网络。当前版本的autodeauth已在树莓派OS和Kali Linux平台上进行过测试,之后的…

Presidential靶机总结

Presidential靶机渗透总结 靶机下载地址: https://download.vulnhub.com/presidential/Presidential.ova 打开靶机,使用nmap扫描出靶机的ip和所有开放的端口 可以看到靶机开放了80端口和2082端口 使用-sV参数查看详细服务 80端口是http服务 2082端口是ssh服务 那么我们先根据…

双向链表实现简单的增删查改

前言:上次分享了单向链表的增删查改,这次要介绍双向链表的增删查改,其实双向链表也有多种,这次主要介绍结构最复杂但是实现起功能反而最简单的带头双向循环链表,希望我的分享对各位有些许帮助。学习这篇文章的内容最好…

[虾说IT]GIS与三高架构(一)什么是高性能

大家好,我是消失了一个年假的不愿意透露姓名的神秘虾神,这是癸卯兔年虾神的第一个系列,聊聊GIS中的架构设计,不过你如果是做其他架构的也差不多……总之是架构是虾神的本职工作之一,那么培养更多的架构设计者和爱好者&…

基于前馈补偿的PID控制算法及仿真

在高精度伺服控制中,前馈控制可用来提高系统的跟踪性能。经典控制理论中的前馈控制设计是基于复合控制思想,当闭环系统为连续系统时,使前馈环节与闭环系统的传递函数之积为1,从而实现输出完全复现输入。利用前馈控制的思想&#x…

剑指 Offer 05. 替换空格 [C语言]

目录题目思路1代码1结果1思路2代码2结果2该文章只是用于记录考研复试刷题题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s “We are happy.” 输出:“We%20are%20happy.” 限制&#xff…

pnpm 简介

本文引用自 摸鱼wiki 1. 与npm,yarn性能比较 actioncachelockfilenode_modulesnpmpnpmYarnYarn PnPinstall33.8s20.1s20.3s40.7sinstall✔✔✔2.1s1.4s2.6sn/ainstall✔✔9.1s5.3s7.8s1.7sinstall✔13.5s9.3s14.1s7.7sinstall✔15s17.2s14.2s33.4sinstall✔✔2.5s3s…

2.JSX

JSX(JavaScript XML) 是 JavaScript 的语法扩展,格式上比较像模板语言。React支持JSX 下面两个代码可以实现相同的功能,JSX看起来要简洁一些 目录 1 使用环境 2 React中的JSX 2.1 特殊的属性 2.2 没有子节点的标签 2.3 小括号包裹 3 JSX使用…

vue 实现动态路由

vue-router对象中的addRoutes&#xff0c;用它来动态添加路由配置格式&#xff1a;router.addRoutes([路由配置对象]) this.$router.addRoutes([路由配置对象])举个例子&#xff1a;// 按钮 <button click"hAddRoute">addRoute</button>// 回调 hAddRout…