C++的起源可以追溯到1979年,当时Bjarne Stroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不同的地⽅可能有差异)在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作。⾯对项⽬中复杂的软件开发任务,特别是模拟和操作系统的开发⼯作,他感受到了现有语⾔(如C语⾔)在表达能⼒、可护性和可扩展性⽅⾯的不⾜。 1983年,Bjarne Stroustrup在C语⾔的基础上添加了⾯向对象编程的特性,设计出了C++语⾔的雏形,此时的C++已经有了类、封装、继承等核⼼概念,为后来的⾯向对象编程奠定了基础。这⼀年该语⾔被正式命名为C++。
这里是祖师爷的照片
看发量就知道是一个大牛
https://zh.cppreference.com/w/cpp
https://en.cppreference.com/w/
说明:第⼀个链接不是C++官⽅⽂档,标准也只更新到C++11,但是以头⽂件形式呈现,内容⽐较易看 好懂。后两个链接分别是C++官⽅⽂档的中⽂版和英⽂版,信息很全,更新到了最新的C++标准,但是 相⽐第⼀个不那么易看;⼏个⽂档各有优势,我们结合着使⽤。
可以看到C++是排在仅次于Python之后的.
这里是语言热度趋势
4.2 C++在⼯作领域中的应⽤
1. ⼤型系统软件开发。如编译器、数据库、操作系统、浏览器等等
2. ⾳视频处理。常⻅的⾳视频开源库和⽅案有FFmpeg、WebRTC、Mediasoup、ijkplayer,⾳视频 开发最主要的技术栈就是C++。 3. PC客⼾端开发。⼀般是开发Windows上的桌⾯软件,⽐如WPS之类的,技术栈的话⼀般是C++和 QT,QT 是⼀个跨平台的 C++图形⽤⼾界⾯(Graphical User Interface,GUI)程序。 4. 服务端开发。各种⼤型应⽤⽹络连接的⾼并发后台服务。这块Java也⽐较多,C++主要⽤于⼀些对 性能要求⽐较⾼的地⽅。如:游戏服务、流媒体服务、量化⾼频交易服务等 5. 游戏引擎开发。很多游戏引擎就都是使⽤C++开发的,游戏开发要掌握C++基础和数据结构,学习 图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习UE4、Cocos2d-x等开源 引擎实现 6. 嵌⼊式开发。嵌⼊式把具有计算能⼒的主控板嵌⼊到机器装置或者电⼦装置的内部,通过软件能够 控制这些装置。⽐如:智能⼿环、摄像头、扫地机器⼈、智能⾳响、⻔禁系统、⻋载系统等等,粗 略⼀点,嵌⼊式开发主要分为嵌⼊式应⽤和嵌⼊式驱动开发。 7. 机器学习引擎。机器学习底层的很多算法都是⽤C++实现的,上层⽤python封装起来。如果你只想 准备数据训练模型,那么学会Python基本上就够了,如果你想做机器学习系统的开发,那么需要学 会C++。 8. 测试开发/测试。每个公司研发团队,有研发就有测试,测试主要分为测试开发和功能测试,测试 开发⼀般是使⽤⼀些测试⼯具(selenium、Jmeter等),设计测试⽤例,然后写⼀些脚本进⾏⾃动化 测试,性能测试等,有些还需要⾃⾏开发⼀些测试⽤具。功能测试主要是根据产品的功能,设计测 试⽤例,然后⼿动的⽅式进⾏测试。
不用多说,大家都知道hello world的含金量吧,接着用C++打印一下hello world
大家会发现,这和c语言不一样啊,表示看不懂,看不懂就对了,因为这个打印是和c语言不同的,接下来我们分析这个程序
先列举一段代码来说明namespace的价值,
先是定义了一个全局变量rand,接着打印他就报错了,因为在头文件里面rand已经被定义成函数了,在定义就会报错了,但是c++中有命名空间,就完善了c语言的不足
将rand放入lm的命名空间之中,然后通过::访问命名空间就可以正确的输出rand了,这一点是c语言做不到的。
定义命名空间需要用到关键字namespace,需要给命名空间起一个名字,名字是可以随便起的,将需要定义的变量封存到命名空间里面,这样就和全局和局部 变量隔离开来,命名空间中可以定义函数/类型/变量等等。
并且namespace是支持嵌套定义的
命名空间域不会影响变量生命周期
项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。 •C++标准库都放在⼀个叫std(standard)的命名空间中。
通过命名空间名+::来访问命名空间中的变量,例如要访问lm这个命名空间,通过lm::rand就可以访问到lm里面的rand了
或者如果访问的次数过多会很麻烦,此时我们可以将变量空间展开
使用using这个关键字,此时无论有没有lm::都可以正常访问到a
对标准库也是一样的,在大型项目中并不推荐直接将std展开,但是在我们日常写小练习,可以直接将std展开。
这个输入输出就是很有意思的地方了,在c语言里面输入是scanf输出是printf,在cpp中,输出是cout,cout是一个标准输出流,与c相比,他就显得很智能了,为什么说智能呢,他可以自动识别数据类型,
在这里我并没说明a是什么类型的,cpp就自己打印出来%d型的
这就是与c相比起来的智能。cout<<这里写要打印的数据,可以是int,double,char型的都可以,cout会自动识别什么类型;
接下来就是输出,输入流是cin,
<<这个符号简单来说,就是箭头指向的地方就是数据流向的方向。
而endl就是我们熟悉的\n,就是换行。
cout,cin,endl都包含在标准库std中。
缺省函数从名字上看,肯定是少点东西的函数,
这里我们定义了一个add函数,当我们不给add传参使,他就使用默认值,当我们给他传参,他就用形参来接收实参,就发生了变化,当然我们可以全传过去,也可以只传一个,
这个是从左到右传参的,
在函数定义,默认值是从右到左依次写,你不能说给a默认值,不给b默认值,这是行不通的,
其次就是函数的定义和声明,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
想必了解java的都知道函数重载,函数重载无非就是同一个名的函数不同的参数类型,
如图所示,add没有改名字,这三个函数名一样,但是参数不同,就可以实现函数重载。
引用是给变量起一个绰号,就如孙悟空,他可以是齐天大圣,也可以是孙行者,还是大师兄,这三个是不同的名字,但实际是同一个人
类型& 引⽤别名 = 引⽤对象;
看这段代码,abc是同一数据,当c改变了,ab也会改变,就如同孙悟空从10岁变为100岁,齐天大圣也从10岁变为100岁,这样就容易理解一些。
引⽤在定义时必须初始化 • ⼀个变量可以有多个引⽤ • 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
接下来看一段代码吧。
如图swap这个函数没有使用指针,却改变了a和b的值,在形参那里,我们把a和b传过去,使用了引用ra就是a的绰号,rb就是b的绰号,此时在实现叫唤,就是a和b实现交换,这在c语言里是要用到指针的,在C++里就可以靠一个引用。
今天的文章就到这了,大家觉得好的话可以点点赞点点收藏,制作不易,感谢支持。