今天我们来学习一门新的语言,也是C语言最著名的一个分支语言:C++。
在C++的学习中,我们主要学习的三大组成部分:语法、STL、数据结构。
C++的介绍
C++的历史可追溯至1979年,当时贝尔实验室的本贾尼·斯特劳斯特卢普博士在面对复杂软件开发任务、尤其是模拟和操作系统开发工作的时候发现了现有语言(如C语言)在表达能力、维护能力、拓展能力的不足。1983年本佳尼博士基于C语言添加了面向对象的编程的特性,也就是C++的雏形。
C++的标准化工程从1989年开始,并成立了ANSI和ISO国际标准化组织的联合标准化委员会。1994年该委员会第一次提出C++的标准化草案。1997年联合标准委员会通过了该标准的最终草案,1998年C++的ANSI\ISO标准正式投入使用。
以下是C++不同版本
年份 | 标准名称 | 核心特性 | 影响与意义 |
---|---|---|---|
1985 | C++ 1.0 | 类、继承、虚函数、运算符重载 | 奠定C++面向对象基础,首个商业编译器发布 |
1989 | C++ 2.0 | 多重继承、抽象类、静态成员函数 | 扩展面向对象能力 |
1998 | C++98 (ISO/IEC 14882:1998) | STL标准模板库、异常处理、RTTI、命名空间 | 首个国际标准,成为工业级语言标杆 |
2003 | C++03 (ISO/IEC 14882:2003) | 修复C++98缺陷、值初始化语法改进 | 过渡性修订版本,未引入重大特性 |
2011 | C++11 (ISO/IEC 14882:2011) | auto 、移动语义、Lambda、智能指针、constexpr 、并发库 | 现代C++革命性起点,大幅提升开发效率与安全性 |
2014 | C++14 (ISO/IEC 14882:2014) | 泛型Lambda、二进制字面量、constexpr 函数增强 | 对C++11的完善补充 |
2017 | C++17 (ISO/IEC 14882:2017) | 结构化绑定、std::filesystem 、if constexpr 、std::optional | 简化代码编写,强化编译期计算 |
2020 | C++20 (ISO/IEC 14882:2020) | 概念(Concepts)、协程(Coroutines)、模块(Modules)、范围库(Ranges) | 重大范式革新,提升泛型编程能力与工程化水平 |
2023 | C++23 (ISO/IEC 14882:2023*) | 标准库模块化、多维数组(mdspan )、格式化库(std::format )、网络库原型 | 进一步优化工程实践,增强数学计算与I/O能力(*预计2023年底发布) |
编译器
但是标准委员会只管理C++的特性,其实现依然要依赖编译器的实施,常用的编译器有三个:VS系列(微软开发)、g++(Linux系统上运行)、clang++(应用较少)。
C++的参考文档
https://legacy.cplusplus.com/reference/
(非官方文档,标准也只到C++11,但是方便阅读)
https://zh.cppreference.com/w/cpp
https://en.cppreference.com/w/
(官方文档,内容更新至最新版本,支持中英双语查看,但是不方便阅读查看。)
C++的重要性
TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎。以下是截止2025年4月编程语言排行榜
python因为近来AI的高速发展而位列第一且上升速度较快。但是由以上图可以发现,C\C++仍然占大部分。尽管相较于JAVA,C++的生态环境开发比较慢(JAVA的网络库约半年更新一次)。
C++在工作领域的应用
C++的应用领域主要在服务器端、游戏(引擎)、机器学习引擎、音视频处理、嵌入式软件、电信设备、金融应用、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面。
1.大型软件开发:如编译器、数据库、操作系统、浏览器等等
2.音视频处理:主要技术栈就是C++
3. PC客户端开发:一般是Windows啊桌面软件。技术栈一般要学习C++和QT(QT是一种跨平台的C++图形界面程序)
4.服务端开发:高性能服务地区
5.嵌入式开发:
6.游戏引擎开发:
7.机器学习引擎开发:底层算法是C++,上层用python封装
8.测试开发:
C++学习书籍推荐
《C++primer》:主要讲解语法,很经典的语法书记。比较晦涩难懂。在拥有一定基础后可以当作语法字典。
《STL源码剖析》:从底层实现的角度深度结合STL,深度剖析STL源码的实现。建议有一定基础后学习观看。
《Effective C++》:关于这本书有一句评价:将程序员分为看过这本书的和没看过这本书的。这本书主要讲解了55个如何正确高效地使用C++的条款。建议有一定基础后或者在工作一两年后看。
请认准以下三本书的封面:
C++学习
首先我们来看一段标准的C++语法写的hello world:
C语言其实一定程度上也可以兼容(但是慎用!!!)
那为什么C++是这么个写法呢?接下来我们就来解析一下:
命名空间
相较于C++,C语言有命名冲突的问题。我们来上一段代码演示一下:
再上图代码中,打印出来的rand的值就是我们定义的10.
但是当我们将头文件<stdlib.h>包含在内的时候,就会发生如下报错:
namespace的定义
1.定义命名空间,需要namespace关键字,后面跟变量的名字,接着一对{}即可,{}中为命名空间的成员。命名空间可以定义变量、类型、函数等。
2.namespace 本质上是定义一个域,这个域跟全局域各自独立,不同的域定义同名变量。所以一下代码的rand不再冲突了
3.C++中域有函数定义域、全局域、命名空间域、类域(定义域和全局域影响生命周期,命名空间域和类域不会 );域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义),所以有了域隔离,名字冲突就解决了。局部域与全局域除了影响编译查找逻辑,还会影响变量的生命周期。命名空间和域类不影响变量生命周期
4.namespace只能定义在全局(当然也可以嵌套定义)
5.项目工程中多文件定义的同名namespace会认为是同一个namespace,不会冲突。
6.C++的标准库都放在一个叫std的(standard)的命名空间中。
命名空间的使用
编译器查找一个变量的声明/定义时,默认只会在全局或者局部找,不会到命名空间去查找。所以我们要使用命名空间中的函数和变量,需要以下三种方式:
1.指定命名空间去访问(项目中推荐这种用法)
2.using将命名空间中的成员展开,项目中经常访问的不存在冲突的成员推荐用这种方式
3.展开命名空间中全部成员(项目中不推荐,因为风险很大,平时小练习为了方便可以用)
如图,以下两种方式等效。
第一种是指定命名方式访问。
,第二种方式就是展开命名空间。
接下来回归最开始的hello world程序
如果我们将展开命名空间std的代码注释掉,就会发生如下情况
在这种情况下如果我们想要打印,可以这样
如果多次应用cout变量,可以这样
C++的输入输出
1.<iostream>是Input Output Stream的缩写,是标准的输入输出流库,定义了输入输出的对象。
2.std::cin是istream类的对象,主要面对窄字符的标准输入流。
3.std::cout是ostream类的对象,主要面对窄字符的标准输出流。
4.std::endl是操作符,底层实现的一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。
5.<<是流插入运算符,>>是流提取运算符(C语言还用它来作为左移右移运算符)
6.使用C++的输入输出更加方便,不需要像printf函数和scanf函数,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现),最重要的是C++的流能更好的支持自定义类型的对象的输入输出。
例如:针对C++中的”类“类型, printf函数作为原生函数,没有对应的格式去打印它,但是C++可以。cin和cout的优势是可以输入输出任意类型。本质是为了支持任意类型输入输出。
7.IO类型涉及类和对象,运算符重载、继承等多方面面对对象的知识,后续学习可以认识。
8.cout/cin/endl都是属于C++标准库,C++标准库放在一个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去使用它们
9.在vs中,我们只要包含了<iostream>头文件即使不包含<stdio.h>也可以使用printf函数和scanf函数,但是注意这种写法在其他编辑器上可能报错。
缺省参数
1.缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
2.全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,,不能间隔跳跃给缺省值。
3.带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
4.函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声照给缺省值
具体如下图所示
但是缺省参数不可以这样传参
同理也不可以只传递第三个参数不传递第一个和第二个。
今天的C++学习就到这里,感谢各位读者大大的观看,求一个赞,谢谢