一、C++ 课程概述与发展历史

1. 发展历程:从 C 语言扩展到标准化

C++ 的起源可追溯至 1979 年,由贝尔实验室的 Bjarne Stroustrup 主导开发。当时他为解决大型项目开发中 C 语言在可维护性和扩展性上的不足,在 C 语言基础上引入了面向对象编程特性。

  • 1983 年:正式命名为 C++,具备类、封装、继承等核心概念
  • 1989 年:启动标准化工作,成立 ANSI 和 ISO 联合委员会
  • 1998 年:首个国际标准 C++98 发布,引入 STL(由 Alexander Stepanov 等人开发)
  • 持续演进:形成了 C++03、C++11、C++14、C++17、C++20、C++23 等版本迭代

2. 版本迭代里程碑

版本发布年份核心特性
C++981998第一个官方版本,引入 STL
C++032003修复 C++98 漏洞,增强稳定性
C++112011革命性更新:lambda、智能指针、右值引用、线程库等
C++142014完善 C++11:泛型 lambda、返回值类型推导
C++172017if constexpr、折叠表达式、文件系统库
C++202020协程、概念(Concepts)、模块化(Modules)
C++232023print 函数、flat_map、import std 导入标准库
C++262026制定中

趣闻:C++23 原定计划包含网络库(networking),但因内部技术路线争议(Senders/Receivers 与 Asio 之争)被推迟至 C++26,引发社区广泛讨论。

二、C++ 的地位与应用领域

1. 编程语言排行榜

根据 2024 年 6 月 TIOBE 排行榜,C++ 位列第二(10.03%),仅次于 Python,领先于 C、Java 等语言。其长期保持高排名的原因在于兼顾性能与抽象能力。

2. 主要应用领域

  • 系统开发:操作系统、编译器、数据库(如 MySQL)
  • 音视频处理:FFmpeg、WebRTC 等核心库
  • 客户端开发:Qt 框架构建的桌面应用(如 WPS)
  • 游戏开发:UE4、Cocos2d-x 等引擎
  • 嵌入式系统:智能设备、车载系统
  • 高性能服务:高频交易、流媒体服务器
  • 机器学习引擎:底层算法实现(上层多为 Python 封装)

三、C++ 基础语法

1. 第一个 C++ 程序

C++ 兼容 C 语言语法,但有自己的输入输出体系:

// C风格实现
#include <stdio.h>
int main() {printf("hello world\n");return 0;
}// C++风格实现
#include <iostream>
using namespace std;  // 命名空间展开
int main() {cout << "hello world" << endl;  // endl等价于换行+刷新缓冲区return 0;
}

2. 命名空间(namespace)

解决命名冲突问题,将标识符本地化:

定义方式
// 基本定义
namespace scr {int rand = 10;  // 与标准库rand函数不冲突int Add(int a, int b) { return a + b; }struct Node { int val; Node* next; };
}// 嵌套定义
namespace scr {namespace s {int x = 1;}namespace c {int x = 2;}
}
使用方式

// 1. 指定命名空间访问(推荐)
scr::Add(1, 2);// 2. 展开单个成员
using scr::s::x;
cout << x << endl;  // 直接使用x// 3. 展开全部成员(不推荐在项目中使用)
using namespace scr;
Add(1, 2);  // 直接使用

3. C++ 输入输出

通过 iostream 库实现,自动识别类型:

#include <iostream>
using namespace std;int main() {int a;double b;char c;// 输入cin >> a >> b >> c;  // 无需格式控制符// 输出cout << a << " " << b << " " << c << endl;// 提高IO效率(竞赛常用)ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return 0;
}

4. 缺省参数

函数声明时指定默认值,调用时可省略实参:

分类
// 全缺省参数
void Func1(int a = 10, int b = 20, int c = 30) {}// 半缺省参数(必须从右往左连续设置)
void Func2(int a, int b = 10, int c = 20) {}
注意事项
  • 调用时必须从左到右传参,不能跳跃
  • 声明与定义分离时,缺省值只能在声明中指定
  • 应用场景:初始化函数(如栈的初始化可指定默认容量)

// 栈初始化示例
void STInit(ST* ps, int n = 4) {  // 声明中指定缺省值ps->a = (int*)malloc(n * sizeof(int));ps->top = 0;ps->capacity = n;
}// 调用
ST s1;
STInit(&s1);  // 使用默认值4
ST s2;
STInit(&s2, 1000);  // 自定义容量

5. 函数重载

允许同一作用域中定义同名函数,需满足形参列表不同(类型 / 个数 / 顺序):

// 1. 参数类型不同
int Add(int a, int b) { return a + b; }
double Add(double a, double b) { return a + b; }// 2. 参数个数不同
void f() { cout << "f()" << endl; }
void f(int a) { cout << "f(int)" << endl; }// 3. 参数顺序不同
void f(int a, char b) { cout << "f(int, char)" << endl; }
void f(char a, int b) { cout << "f(char, int)" << endl; }

注意:返回值不同不能作为重载条件,会导致调用歧义。

6. 引用(&)

为已有变量取别名,与原变量共享内存空间:

基本特性

int a = 10;
int& b = a;  // b是a的别名
int& c = b;  // c也是a的别名// 特性1:必须初始化
// int& d;  // 编译错误// 特性2:一旦引用一个实体,不能再引用其他实体
int x = 20;
b = x;  // 这是赋值,不是更改引用
应用场景
  1. 引用传参:替代指针,简化代码

void Swap(int& x, int& y) {  // 无需指针解引用int tmp = x;x = y;y = tmp;
}

  1. 引用返回:减少拷贝,可直接修改返回值

int& STTop(ST& s) {  // 返回栈顶元素引用return s.a[s.top - 1];
}// 调用
ST s;
STPush(s, 10);
STTop(s) += 5;  // 直接修改栈顶元素
const 引用

限制对引用对象的修改,可引用常量和临时对象:

const int a = 10;
const int& ra = a;  // 必须用const引用int b = 20;
const int& rb = b;  // 权限缩小,允许
// rb = 30;  // 编译错误,不能修改const int& rc = 10;  // 可引用常量
const int& rd = a + b;  // 可引用表达式临时结果

7. 内联函数(inline)

编译时在调用处展开,避免函数调用的栈帧开销:

inline int Add(int a, int b) {  // 内联声明return a + b;
}int main() {int ret = Add(1, 2);  // 编译时展开为ret = 1 + 2return 0;
}

特点

  • 适用于频繁调用的短小函数(通常少于 10 行)
  • 递归函数不会被内联
  • 声明与定义通常不分离(避免链接错误)
  • 替代 C 语言的宏函数,兼顾效率与安全性

8. nullptr

C++11 引入的空指针常量,解决 NULL 的二义性:

void f(int x) { cout << "f(int)" << endl; }
void f(int* p) { cout << "f(int*)" << endl; }int main() {f(0);         // 调用f(int)f(NULL);      // NULL被定义为0,仍调用f(int)f((int*)NULL);// 需显式转换才能调用f(int*)f(nullptr);   // 直接调用f(int*),推荐用法return 0;
}

四、C++ 学习建议

1. 难度认知

C++ 因历史包袱和特性复杂性,学习曲线较陡峭。网上流传的 "21 天精通 C++" 是笑话,实际掌握需要长期实践。

2. 学习方法

  • 多练习课堂示例,理解每个知识点
  • 整理笔记或博客,尤其是重点章节
  • 参与项目开发,将理论应用于实践

3. 推荐书籍

  • 《C++ Primer》:语法权威指南,适合全程参考
  • 《STL 源码剖析》(侯捷):深入理解 STL 实现原理
  • 《Effective C++》(Scott Meyers):55 个高效使用 C++ 的准则

五、总结

C++ 作为一门兼顾性能与抽象能力的编程语言,既保留了 C 语言的底层操作能力,又引入了面向对象编程和泛型编程等高级特性。本文从发展历史、核心语法到学习建议,全面覆盖了 C++ 入门的关键知识点。

掌握这些基础是深入学习 STL 和高阶数据结构的前提。建议在实践中逐步理解各特性的设计初衷和适用场景,避免机械记忆。C++ 的学习是一个持续精进的过程,随着实践深入,对语言特性的理解会不断加深。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

labelme数据标注保姆级教程:从安装到格式转换全流程,附常见问题避坑指南(含视频讲解)

引言&#xff1a;为什么选择labelme&#xff1f; 在人工智能和机器学习领域&#xff0c;高质量的标注数据是训练优秀模型的基础。而 labelme作为一款开源、跨平台的图像标注工具&#xff0c;凭借其强大的功能和易用性&#xff0c;成为了数据标注领域的热门选择。 它支持多种标…

人工智能-python-深度学习-自动微分

自动微分&#xff1a;基础概念与应用 自动微分&#xff08;Autograd&#xff09;是现代深度学习框架&#xff08;如PyTorch、TensorFlow&#xff09;中的一个核心功能。它通过构建计算图并在计算图上自动计算梯度&#xff0c;简化了反向传播算法的实现。以下是自动微分的基本概…

k8s原理及操作

简介 kubernetes的本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器 进行管理。目的是实现资源管理的自动化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修复&#xff1a;一旦某一个容器崩溃&#xff0c;能够在…

理解音频响度:LUFS 标准及其计算实现

LUFS 及其重要性 1.1、什么是 LUFS&#xff1f; LUFS&#xff08;Loudness Units relative to Full Scale&#xff09;是音频工程中用于测量感知响度的标准单位。它已成为广播、流媒体和音乐制作领域的行业标准&#xff0c;用于确保不同音频内容具有一致的响度水平。 LUFS 是 I…

【在ubuntu下使用vscode打开c++的make项目及编译调试】

在ubuntu下使用vscode打开c的make项目及编译调试第一步&#xff1a;安装必要的软件第二步&#xff1a;示例项目准备1. 创建C源文件&#xff1a; main.cpp2. 创建头文件&#xff1a; utils.h3. 创建实现文件&#xff1a; utils.cpp第三步&#xff1a;使用 VS Code 打开项目第四步…

3-2.Python 函数 - None(None 概述、None 应用场景)

一、None 概述在 Python 中&#xff0c;None 是一个特殊的常量&#xff0c;用于表示空值或无值None 是 Python 中唯一的一个 NoneType 类型的实例二、None 应用场景 1、定义变量 None 常用于初始化变量&#xff0c;表示该变量暂时不需要有具体值 name Noneprint(name) print(t…

js获取html元素并设置高度为100vh-键盘高度

获取HTML元素并设置高度为(100vh - 键盘高度) 我将设计一个页面&#xff0c;展示如何获取HTML元素并动态设置其高度为视口高度减去键盘高度&#xff0c;这在移动设备上特别有用&#xff0c;可以避免键盘遮挡内容。 设计思路 创建一个带有输入框的界面&#xff0c;模拟键盘弹…

基于SpringBoot的校园博客管理系统

&#x1f517; 目录 一. 前言   二. 前端框架、后端框架以及存储框架使用情况说明   三. 核心技术     1. ✅Java开发语言     2. ✅MyBatis     3. ✅Mysql     4. ✅Vue     5. ✅部署项目   四. 演示效果     1. 管理员功能模块       …

Nginx + Certbot配置 HTTPS / SSL 证书

前提条件&#xff1a; 1.已有域名 2.Nginx 已安装并正在运行&#xff0c;且有对应的 Server 配置 3.防火墙开放 80 和 443 端口 安装 EPEL 仓库&#xff1a; sudo yum install epel-release -y安装 Snapd sudo yum install snapd -y启用并启动 Snapd Socket sudo systemctl ena…

图结构使用 Louvain 社区检测算法进行分组

图结构使用 Louvain 社区检测算法进行分组 flyfish Louvain 算法是一种基于模块度最大化的社区检测算法&#xff0c;核心目标是在复杂网络中找到“内部连接紧密、外部连接稀疏”的社区结构。它的优势在于高效性&#xff08;可处理百万级节点的大规模网络&#xff09;和近似最优…

layui.formSelects自定义多选组件在layer.open中使用、获取、复现

layui.formSelects自定义多选组件在layer.open中使用、获取、复现 引入css和js //<th:block th:include"include :: layui-formSelects-css"/> <link th:href"{/ajax/libs/layui-formSelects/formSelects-v4.css}" rel"stylesheet"/>…

基于SpringBoot的社团管理系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

运行node18报错

又碰到一个奇葩的问题&#xff0c;报错如下> tigermes.vue30.1.0 serve > vue-cli-service serveBrowserslist: caniuse-lite is outdated. Please run:npx update-browserslist-dblatestWhy you should do it regularly: https://github.com/browserslist/update-db#rea…

Python第三方库IPFS-API使用详解:构建去中心化应用的完整指南

目录 Python第三方库IPFS-API使用详解&#xff1a;构建去中心化应用的完整指南 引言&#xff1a;IPFS与去中心化存储的革命 星际文件系统&#xff08;IPFS&#xff0c;InterPlanetary File System&#xff09;是一种革命性的点对点超媒体协议&#xff0c;旨在创建持久且分布式的…

ETL与iPaaS的融合方案:加速数据集成流程

在今天的商业世界里&#xff0c;数据几乎无处不在。企业每天都在产生和接收海量的数据——从CRM到ERP&#xff0c;从云端SaaS应用到本地数据库&#xff0c;来源越来越分散&#xff0c;集成也越来越复杂。 传统的ETL工具&#xff08;提取、转换、加载&#xff09;在处理结构化数…

详解flink SQL基础(四)

文章目录1.Flink SQL介绍2.streaming SQL&watermarks使用3.窗口聚合&#xff08;window aggregations&#xff09;4.over aggregations5.FlinkSQL 流连接&#xff08;Streaming join&#xff09;6.使用MATCH_RECOGNIZE 进行模式识别和复杂事件处理7.变更记录&#xff08;ch…

有鹿机器人:为城市描绘清洁新图景的智能使者

一、智慧清洁&#xff1a;科技赋能的环境革新每天清晨&#xff0c;当我沿着小区路径缓缓行驶&#xff0c;双激光雷达系统便开始精准测绘环境。我的专业清扫能力源自2cm精度死亡贴边技术&#xff0c;这项让同行惊叹的能力&#xff0c;可以轻松震出嵌了十年的烟头&#xff0c;彻底…

Tableau Server高危漏洞允许攻击者上传任意恶意文件

Tableau Server 存在一个严重安全漏洞&#xff0c;可能允许攻击者上传并执行恶意文件&#xff0c;最终导致系统完全沦陷。该漏洞编号为 CVE-2025-26496&#xff0c;CVSS 评分为 9.6 分&#xff0c;影响 Windows 和 Linux 平台上的多个 Tableau Server 和 Tableau Desktop 版本。…

数据结构07(Java)-- (堆,大根堆,堆排序)

前言 本文为本小白&#x1f92f;学习数据结构的笔记&#xff0c;将以算法题为导向&#xff0c;向大家更清晰的介绍数据结构相关知识&#xff08;算法题都出自&#x1f64c;B站马士兵教育——左老师的课程&#xff0c;讲的很好&#xff0c;对于想入门刷题的人很有帮助&#x1f4…

onnx入门教程(七)——如何添加 TensorRT 自定义算子

在前面的模型入门系列文章中&#xff0c;我们介绍了部署一个 PyTorch 模型到推理后端&#xff0c;如 ONNXRuntime&#xff0c;这其中可能遇到很多工程性的问题。有些可以通过创建 ONNX 节点来解决&#xff0c;该节点仍然使用后端原生的实现进行推理。而有些无法导出到后端的算法…