C/C++学前指南

汽车   2024-09-12 19:46   安徽  
我们都知道的,C++是一门非常复杂且难学的高级编程语言。无数踌躇满志的初学者挣扎于C++的苦海之中,觉得它是如此的纷繁复杂,特性之多眼花缭乱。如果你打算学习C++,或正在学习C++,那么你可以花大概五分钟的时间,来阅读一下这篇文章的分享,为你提供一个视角来审视C++,但本篇文章并不说明具体编程语言的概念,它更像一个地图,让你在学习C++的过程中不迷路,知道自己处于何方,以及应该走向何方。
C++的语法很多、特性很多,但归根结底它们都是在做同一件事情,即“操作数据”,为了实现这一目的,有了“语句”来实现控制数据,有了“数据类型/结构”来组织数据。而我们在学习C++的很多时候并未意识到,原因是语句与数据类型/结构往往都是相互揉和在一起的,一行代码下来既有数据又有语句。所以,首先我们要知道的是,编程语言无论有多少语法、多少特性,它们都是为了实现“操作数据”这一目的而存在。

为了实现“操作数据”这一目的,有了“语句”和“数据类型/结构”。由此我们可以对整个C++语法进行知识重构,先构建这棵树的枝干部分,“语句”包括声明语句、赋值语句、运算语句、控制语句、异常处理语句、函数代码块。“数据类型/结构”包括基本数据类型、数据结构、自定义数据类型\结构。

一、语句:

  1. 声明语句:变量声明、函数声明、数据类型/结构声明等

  2. 赋值语句:左值、右值等

  3. 运算语句:数字计算、逻辑运算等

  4. 控制语句:if语句switch语句、for循环、while循环、goto语句等

二、数据类型/结构:

  1. 基本数据类型:char、int、float、double、bool、void

  2. 数据结构:数组、字符串、结构体、联合、枚举

  3. 自定数据类型\结构:类、类模板

为了能够减少重复代码,提高代码可读性和可维护性,语言中往往有函数这一特性,让我们能够抽象语句,使之成为一个可重复调用的代码块。

一>函数:

  • void函数

  • 常规函数

  • 内联函数

  • 重载函数

  • 模板函数

  • 递归函数

为了更为高效的实现“操作数据”这一目的,C++之中有指针,让我们能够直接操作内存,省去了各种中间开销。而指针则很像这棵树各个枝干上的叶子,任何部分都与它息息相关,都与它产生了某种故事。也因此,指针的掌握变得非常困难,因为它几乎可以和C++中的任何事情扯上关系。

二>指针:

  • 指针

  • 指针的运算

  • 指针和数组

  • 指针和函数

  • 指针和结构体

  • 指针和其他数据类型/结构

  • 指针和引用的区分

二>内存管理:

  • 申请/释放内存

  • 内存中的栈与堆

  • 各种数据内存结构布局

  • 生命周期

  • 数据占用大小计算

  • 明晰数据的自动释放和手动释放

C++之中有其本身约定好定义好的数据规则提供给你,比如简单数据类型(整数、浮点数、双精度浮点数等)、数据结构(数组、结构体等),如果需要更多的控制,则进而可以在它们的基础上添加修饰符(short、long、unsigned、const、static、inline等),这些是语言本身提供给你的,还有一大重要的部分是,你自己定义数据的组织形式,在C++中通过类、类模板来实现。类这一部分是枝干上一个非常庞大的部分。

二>3、类:

  • 类和对象

  • 类的构造函数和析构函数

  • 类的this指针

  • 类的const成员和static成员

  • 类的运算符重载

  • 访问控制、友元函数

二>3类进阶:

  • 自定义类型转换

  • C++默认在背后自动的操作

  • 深拷贝、浅拷贝

  • 智能指针

  • 派生类

  • 虚函数

  • 继承类

二>3类模板

  • 类模板

  • 模板的非类型参数

  • 类模板的特化

你可以选择自己定义和设计一个自己的数据类型/结构,来组织和处理某种数据,但往往我们会选择前人已经细心雕琢和无数人验证过的标准库或第三方库。在这些标准库或第三方库中,会有已经定义好的数据类型/结构、提供某种功能的接口、已经设计好的算法等。比如你要处理图片,你需要定义一个矩阵,通过类或结构体可以实现,但在OpenCV内已经提供了一个由很多专家设计的类了,通过使用他们定义和设计好的数据类型/结构,高效便捷的处理和操作数据。而掌握前面所述内容,一方面是为了更好的了解专家设计的数据类型/结构,另一方面也是为以后你也可以设计出高质量的数据类型/结构打下基础。

三、C++ STL

标准模板库(STL),C++标准库,包含了一些模板化的通用的数据结构和算法。其核心分为三个部分:容器、算法、迭代器,另外还有仿函数、适配器、分配器。
  • 容器:用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。

  • 算法:算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。

  • 迭代器:迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

四、C/C++标准库

<- C标准库 -> 

  • 标准函数库:继承自C语言标准库

<- 输入输出 -> 

  • <iostream>标准输入输出流

  • <fstream>文件输入输出流

  • <sstream>字符串流

  • <iomainip>输入输出流格式化

<- 各种工具 -> 

  • <cstdlib>: 提供了各种通用的函数工具

<- 简单容器 -> 
  • <array>: 定长数组容器

  • <vector>: 动态数组容器

  • <deque>: 双端队列容器

  • <list>: 双向链表容器

  • <forward_list>: 单向链表容器

  • <stack>: 栈容器适配器

  • <queue>: 队列容器适配器

  • <priority_queue>: 优先队列容器适配器

<- 复杂容器 -> 

  • <set>: 集合容器(基于平衡二叉树)

  • <unordered_set>: 无序集合容器(基于哈希表)

  • <map>: 映射容器(键值对,基于平衡二叉树)

  • <unordered_map>: 无序映射容器(基于哈希表)

  • <bitset>: 二进制位容器

<- 算法和迭代器 -> 

  • <algorithm>: 常用算法(如排序、查找等)

  • <iterator>: 迭代器

<- 函数和对象绑定 -> 

  • <functional>: 定义函数对象及相关工具

<- 数学和数字运算 -> 

  • <numeric>: 数值操作(如累计、乘积等)

  • <complex>: 复数运算

  • <valarray>: 数组类及相关操作

  • <cmath>: 数学函数

<- 字符串和正则 -> 

  • <string>: 标准字符串类

  • <regex>: 正则表达式

<- 时间和日期 -> 

  • <ctime>: 时间处理

  • <chrono>: 时间库

<- 多线程和并发 -> 

  • <thread>: 多线程支持

  • <mutex>: 互斥量

  • <condition_variable>: 条件变量

  • <future>: 异步编程支持

  • <atomic>: 原子操作

<- 内存管理 -> 

  • <memory>: 智能指针及动态内存管理

  • <new>: 动态内存分配

<- 类型特性和运行时类型识别 -> 

  • <type_traits>: 类型特性

  • <typeinfo>: 运行时类型识别

<- 异常处理 -> 

  • <exception>: 异常处理基类及相关工具

  • <stdexcept>: 常用异常类(如 std::runtime_error 等)

五、C++第三方库
  • Qt: 是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。

  • Clmg: 是一个小型的C++图像处理库,适用于快速开发和原型设计。它具有简单易用的API和高效的图像处理算法。

  • OpenCV: 是一个开源计算机视觉库,提供了丰富的图像处理和计算机视觉算法,适用于各种应用领域。
  • ITK: 是一个专门用于医学图像处理的开源工具包,提供了丰富的算法和工具,用于分割、配准、重建等医学图像处理任务。
  • Dlib: 是一个强大的C++机器学习工具包,包括许多图像处理和计算机视觉功能,如人脸检测、对象跟踪、特征点检测等。
因为开源的繁荣发展,仍然有数以万计的高质量的第三方库等待着你的挖掘和使用。同时我们要知道的是,标准库/第三方库都是由无数的前人写出来的,也是利用着上面的那些特性所设计出来,因此在面对海量的库时,不必妄想全部都掌握,而是知道如何利用它们,在需要时去查,去正确的使用,更好的是同时了解其内在原理。在最开始时先握一些常用的库即可,在随着不断地使用中,逐渐的了解和熟悉其他的库。

摩托佬的机车世界
一个想给摩托车装上眼睛的机车爱好者,专注分享摩托车的相关内容,欢迎进入为你精心打造的机车世界。
 最新文章