C++ 入门核心知识
一、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++98 | 1998 | 第一个官方版本,引入 STL |
C++03 | 2003 | 修复 C++98 漏洞,增强稳定性 |
C++11 | 2011 | 革命性更新:lambda、智能指针、右值引用、线程库等 |
C++14 | 2014 | 完善 C++11:泛型 lambda、返回值类型推导 |
C++17 | 2017 | if constexpr、折叠表达式、文件系统库 |
C++20 | 2020 | 协程、概念(Concepts)、模块化(Modules) |
C++23 | 2023 | print 函数、flat_map、import std 导入标准库 |
C++26 | 2026 | 制定中 |
趣闻: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; // 这是赋值,不是更改引用
应用场景
- 引用传参:替代指针,简化代码
void Swap(int& x, int& y) { // 无需指针解引用int tmp = x;x = y;y = tmp;
}
- 引用返回:减少拷贝,可直接修改返回值
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++ 的学习是一个持续精进的过程,随着实践深入,对语言特性的理解会不断加深。