一、C++ 是什么?为什么要学 C++?
(一)C++ 的起源与定位
C++ 由 Bjarne Stroustrup 在 1985 年设计,最初名为 "带类的 C",是 C 语言的扩展。它融合了面向过程编程(C 语言特性)、面向对象编程(OOP)和泛型编程,是一种静态类型、编译型、通用目的的编程语言。
(二)C++ 的应用场景
- 系统级开发:操作系统(如 Windows 内核部分代码)、驱动程序、嵌入式设备
- 高性能场景:游戏开发(虚幻引擎、Unity 底层)、金融计算、人工智能框架(TensorFlow 核心)
- 跨平台开发:桌面软件(Adobe 系列)、服务器后端(Redis、MySQL)
- 教育意义:理解计算机底层原理(内存管理、指针),培养严谨的编程思维
(三)C++ 的特点
- 接近硬件:支持指针和内存直接操作
- 高效性:编译后生成机器码,执行速度媲美 C 语言
- 灵活性:支持多种编程范式
- 标准丰富:C++20 引入协程、概念(Concepts)等现代特性
二、C++ 基础语法:从 Hello World 开始
(一)第一个 C++ 程序
#include <iostream> // 输入输出头文件
#include <bits/stdc++.h>//万能头文件
using namespace std; // 使用标准命名空间
int main() { // 程序入口函数
cout << "Hello, C++!" << endl; // 输出到控制台
return 0; // 程序正常结束
}
- #include:预处理指令,引入标准库头文件
- namespace std:避免命名冲突,std 包含 cin/cout 等常用对象
- main函数:必须返回 int 类型,操作系统通过返回值判断程序状态
(二)数据类型与变量
类型 | 说明 | 示例 |
基本类型 | int, float, double, char | int age = 18; |
复合类型 | 数组、结构体、枚举 | struct Student { string name; }; |
布尔类型 | bool(true/false) | bool is_ok = true; |
类型别名 | using 定义别名 | using ll = long long; |
(三)控制结构
1. 条件语句
int score = 85;
if (score >= 90) {
cout << "A" << endl;
} else if (score >= 80) {
cout << "B" << endl; // 输出B
} else {
cout << "C" << endl;
}
2. 循环语句
// for循环:打印1-5
for (int i=1; i<=5; i++) {
cout << i << " "; // 1 2 3 4 5
}
// while循环:计算1+2+...+100
int sum = 0, n=1;
while (n <= 100) {
sum += n;
n++;
}
cout << sum << endl; // 5050
(四)函数:代码复用的基础
// 函数声明
int add(int a, int b);
// 函数定义
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 5); // 调用函数
cout << "3+5=" << result << endl; // 8
return 0;
}
- 函数需先声明后使用(或定义在调用之前)
- 支持默认参数:int add(int a, int b=0)
- 支持函数重载:相同函数名不同参数列表
三、面向对象编程(OOP):C++ 的核心特性
(一)类与对象:万物皆可抽象
// 定义类:Circle(圆)
class Circle {
private: // 私有成员,外部不可直接访问
double radius; // 半径
public: // 公有成员,外部可访问
// 构造函数:初始化对象
Circle(double r) : radius(r) {}
// 成员函数:计算面积
double getArea() {
return 3.14 * radius * radius;
}
};
int main() {
Circle c(5.0); // 创建对象,调用构造函数
cout << "面积:" << c.getArea() << endl; // 78.5
return 0;
}
- 类是对象的模板,对象是类的实例
- 封装:通过访问修饰符(private/protected/public)隐藏内部实现
(二)继承:代码重用的利器
// 基类:Animal
class Animal {
public:
void speak() {
cout << "动物发出声音" << endl;
}
};
// 派生类:Dog,继承Animal
class Dog : public Animal {
public:
void speak() { // 重写(覆盖)基类函数
cout << "汪汪汪" << endl;
}
};
int main() {
Dog d;
d.speak(); // 汪汪汪(多态体现)
return 0;
}
- 单继承:class 子类 : 访问权限 父类
- 多继承:class C : public A, public B(需注意菱形继承问题)
(三)多态:同一接口不同实现
class Shape {
public:
virtual double getArea() { // 虚函数
return 0.0;
}
};
class Rectangle : public Shape {
private:
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double getArea() override { // C++11新增关键字,显式声明重写
return width * height;
}
};
int main() {
Shape* s = new Rectangle(4, 5);
cout << "面积:" << s->getArea() << endl; // 20(动态多态)
delete s;
return 0;
}
- 虚函数:通过virtual关键字声明,支持运行时动态绑定
- 纯虚函数:virtual double getArea() = 0,用于定义接口(抽象类)
四、C++ 标准库:高效开发的基石
(一)输入输出流(IO Stream)
#include <iostream>
#include <string>
using namespace std;
int main() {
// 输入
string name;
int age;
cout << "请输入姓名和年龄:";
cin >> name >> age; // 支持自动类型匹配
// 输出格式化
cout << "你好," << name << "!你今年" << age << "岁" << endl;
cout << "圆周率:" << fixed << setprecision(4) << 3.1415926 << endl; // 3.1416
return 0;
}
- 头文件:<iostream>(非 C 风格 IO)、<iomanip>(格式化输出)
- 优势:类型安全,支持自定义类型输入输出
(二)字符串处理(string 类)
#include <string>
#include <cctype> // 字符处理函数
int main() {
string str = "Hello, C++!";
// 长度与遍历
cout << "长度:" << str.length() << endl; // 12
for (char c : str) cout << c; // 范围for循环(C++11)
// 操作函数
str.append(" Welcome!"); // 拼接
str.erase(5, 1); // 删除索引5的逗号
transform(str.begin(), str.end(), str.begin(), ::toupper); // 转大写
return 0;
}
- 动态数组实现,自动管理内存
- 支持运算符重载:str1 = str2; str3 = str1 + str2;
(三)容器与算法:STL(标准模板库)
1. 序列容器
#include <vector>
#include <list>
#include <deque>
int main() {
// vector:动态数组
vector<int> nums = {1, 2, 3};
nums.push_back(4); // 尾部插入
cout << "第一个元素:" << nums.front() << endl; // 1
// list:双向链表
list<string> names;
names.push_front("Alice"); // 头部插入
names.sort(); // 内置排序函数
return 0;
}
2. 关联容器
#include <map>
#include <set>
int main() {
// map:键值对存储
map<string, int> scores;
scores["张三"] = 90;
scores["李四"] = 85;
cout << "张三的分数:" << scores["张三"] << endl; // 90
// set:无序不重复集合
set<int> s = {3, 1, 2};
s.insert(3); // 重复插入无效
cout << "大小:" << s.size() << endl; // 3
return 0;
}
3. 算法库
#include <algorithm>
int main() {
vector<int> nums = {3, 1, 4, 1, 5, 9};
sort(nums.begin(), nums.end()); // 排序:1 1 3 4 5 9
reverse(nums.begin(), nums.end()); // 反转:9 5 4 3 1 1
int count = count(nums.begin(), nums.end(), 1); // 统计1的个数:2
return 0;
}
五、进阶知识:从初级到中级的跨越
(一)指针与引用:操作内存的关键
int main() {
// 指针:存储内存地址
int a = 10;
int* ptr = &a; // 取地址
cout << "*ptr = " << *ptr << endl; // 10(解引用)
// 引用:变量的别名
int& ref = a;
ref = 20;
cout << "a = " << a << endl; // 20
return 0;
}
- 指针运算:ptr++(指向下一个同类型变量)
- 空指针:int* p = nullptr;(C++11 替代 NULL)
(二)内存管理:手动与自动
1. 动态内存分配(手动)
int* arr = new int[5]; // 分配数组内存
for (int i=0; i<5; i++) arr[i] = i;
delete[] arr; // 释放内存(避免内存泄漏)
2. 智能指针(自动,C++11)
#include <memory>
class Resource {
public:
~Resource() { cout << "释放资源" << endl; }
};
int main() {
// 独占所有权:unique_ptr
unique_ptr<Resource> res1(new Resource());
// 共享所有权:shared_ptr(引用计数)
shared_ptr<Resource> res2 = make_shared<Resource>();
return 0; // 离开作用域自动释放
}
(三)模板与泛型编程:代码的万能模板
// 函数模板
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
// 类模板
template <typename T>
class Vector {
private:
T* data;
public:
Vector() { data = new T[0]; }
};
int main() {
cout << max(3, 5) << endl; // 5(int类型)
cout << max(3.14, 2.71) << endl; // 3.14(double类型)
return 0;
}
- 类型参数:typename或class
- 模板特化:针对特定类型的特殊实现
六、C++ 开发环境搭建
(一)常用编译器
- GCC/G++:跨平台(Linux/macOS/Windows WSL),命令行编译
g++ main.cpp -o program && ./program
- Clang++:苹果平台默认编译器,编译速度快
- MSVC:Windows 平台 Visual Studio 内置编译器
(二)集成开发环境(IDE)
- Visual Studio:Windows 首选,支持调试、智能提示、项目管理
- CLion:跨平台(JetBrains 出品),支持 C++ 最新标准
- VS Code:轻量级,通过插件配置 C++ 开发环境(推荐新手)
(三)调试技巧
- 断点调试:在代码行设置断点,逐行执行(F10 单步跳过,F11 单步进入)
- 查看变量:调试时鼠标悬停变量查看值,或通过监视窗口
- 错误处理:学会阅读编译错误信息(注意行号和语法错误)
七、C++ 的应用案例:从代码到现实
(一)控制台程序:学生成绩管理系统
实现功能:录入学生信息(姓名、学号、成绩),计算平均分,排序输出。技术点:结构体、数组、函数封装、文件读写(fstream)。
(二)图形界面:简易计算器(需配合 GUI 库)
使用 Qt 库:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QPushButton button("Hello Qt!");
button.show();
return app.exec();
}
(三)算法实现:排序与查找
#include <vector>
#include <algorithm>
// 快速排序(STL实现)
vector<int> nums = {5, 2, 3, 1, 4};
sort(nums.begin(), nums.end()); // 内置快速排序
// 二分查找
bool exists = binary_search(nums.begin(), nums.end(), 3); // true
八、学习资源推荐
(一)入门书籍
- 《C++ Primer》(第五版):经典教材,适合系统学习
- 《C++ 程序设计语言》(特别版):作者亲笔,深入理解语言设计
- 《啊哈 C++》:漫画风格,适合零基础入门
(二)在线课程
- Coursera《C++ for Everybody》:密歇根大学课程,循序渐进
- 网易云课堂《C++ 基础入门》:适合国内新手,案例丰富
(三)编程练习
- LeetCode:算法题练习(选择 C++ 语言)
- Codeforces:编程竞赛平台,提升实战能力
- 洛谷:中文算法 OJ,适合新手刷题
九、给新手的学习建议
- 先掌握 C 语言基础:C++ 兼容 C 语言,指针、数组等概念需要 C 语言打底
- 多写代码:每学一个知识点立即编写小例子(如定义类、使用 STL 容器)
- 理解内存模型:指针和内存分配是 C++ 的难点,通过调试观察内存变化
- 关注标准更新:C++11/14/17/20 引入很多新特性(如 auto、range for),优先学习现代 C++ 写法
- 参与项目:从简单的控制台程序开始,逐步尝试 GUI 开发、算法实现
总结:C++ 是通往编程世界的一把钥匙
C++ 虽然入门难度较高,但掌握后能深入理解计算机底层原理,培养高效的编程思维。它不仅是一门编程语言,更是理解现代软件开发的基础。无论你未来从事系统开发、游戏编程还是算法研究,C++ 都能为你打下坚实的基础。现在就打开编译器,写下你的第一个 C++ 程序吧!记住:编程学习的唯一捷径,就是不断实践!