一、C++ 的诞生:一段不得不说的历史
聊 C++ 之前,我想先问你一个问题:为什么会有 C++?
上世纪 70 年代末,Bjarne Stroustrup 在贝尔实验室写博士论文。他当时用的语言叫 Simula,这东西有类、有继承,概念很先进。但跑起来太慢了,实用性差。反过来看 C 语言,效率高、能直接操作硬件,但抽象能力弱——你要写个复杂的数据结构,得自己手撸一堆函数指针。
Bjarne 的想法很简单:能不能把 Simula 的面向对象思想,嫁接到 C 语言上?
于是 1979 年,他搞了个「带类的 C」(C with Classes)。1983 年正式改名为 C++。那个 ++ 符号,其实就是 C 语言的自增运算符——暗示着「C 语言的升级版」。
我个人觉得,C++ 最牛的地方在于:它不强迫你用某种范式。你可以写面向过程、面向对象、泛型编程,甚至函数式风格。这种灵活性,让它在游戏引擎、高频交易、嵌入式系统、大型桌面软件等领域站稳了脚跟。
核心要点:C++ 是 C 语言的超集,保留了 C 的高效和底层控制力,同时加入了类、继承、多态、模板等高级特性。
C++ 的版本演进
你可能听说过 C++98、C++11、C++17 这些名词。它们不是不同的语言,而是同一个语言的不同标准版本。我简单列一下:
| 标准版本 | 发布时间 | 主要特性 |
|---|---|---|
| C++98 | 1998 年 | 第一个国际标准,模板、STL 标准库 |
| C++11 | 2011 年 | auto 类型推导、智能指针、Lambda 表达式、右值引用 |
| C++14 | 2014 年 | 泛型 Lambda、返回类型推导 |
| C++17 | 2017 年 | if constexpr、结构化绑定、文件系统库 |
| C++20 | 2020 年 | 概念(Concepts)、协程、范围(Ranges) |
嗯,这里要注意:不要一上来就追最新标准。我在项目中见过有人用 C++20 的协程写代码,结果同事的编译器不支持,编译都过不了。实际开发中,C++17 是目前最稳妥的选择,兼容性好、特性也够用。
二、搭建开发环境:MinGW 与 GCC
要写 C++,你得先有个编译器。说白了,编译器就是把人类能读懂的 C++ 代码,翻译成机器能执行的二进制指令。
Windows 上最常用的 C++ 编译器套装是 MinGW(Minimalist GNU for Windows)。它里面包含了 GCC(GNU Compiler Collection),这是 Linux 世界最主流的编译器。MinGW 把 GCC 移植到了 Windows 上,让你能在 Windows 下用 Linux 那套工具链。
安装 MinGW 的步骤
- 下载安装包:去 MinGW 官网或 SourceForge 下载 mingw-get-setup.exe。
- 运行安装程序:选择安装目录,我建议直接装到
C:\MinGW,路径里不要有中文和空格。 - 选择组件:至少勾选
mingw32-gcc-g++(C++ 编译器)和mingw32-gcc(C 编译器)。 - 应用更改:菜单栏点 Installation → Apply Changes,等待下载完成。
- 配置环境变量:把
C:\MinGW\bin添加到系统的 PATH 环境变量中。
小技巧:安装完成后,打开命令行输入 g++ --version,如果能看到版本号,说明安装成功了。我曾经帮一个同事排查了半天,最后发现他输成了 gcc --version——gcc 是 C 编译器,g++ 才是 C++ 的,别搞混了。
Linux / macOS 用户
如果你用的是 Linux,直接 sudo apt install g++(Ubuntu/Debian)或 sudo yum install gcc-c++(CentOS/RHEL)就行。macOS 上装 Xcode Command Line Tools,里面自带 clang 编译器,用法和 g++ 基本一样。
三、第一个程序:Hello World
好了,环境搭好了,我们来写第一个 C++ 程序。这是每个程序员的仪式感——让计算机对你说一声「你好,世界」。
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
这段代码不长,但里面藏着 C++ 的几个核心概念。我拆开给你讲:
#include <iostream>:这是预处理指令。iostream 是输入输出流库,cout 和 endl 都来自这里。说白了,就是告诉编译器:「我要用标准输入输出功能」。int main():程序的入口函数。每个 C++ 程序必须有且只有一个 main 函数。程序从这里开始执行。std::cout:标准输出流。std 是命名空间,cout 是输出对象。你可以把它理解成「向屏幕写东西的管道」。<<:流插入运算符。把右边的数据「塞进」左边的流里。std::endl:换行并刷新缓冲区。相当于 C 语言里的\n加 fflush。return 0;:告诉操作系统程序正常结束。非零值通常表示有错误。
注意:C++ 是大小写敏感的。Main 和 main 是两个东西。我见过新手把 main 写成 Main,编译直接报错。还有分号——C++ 里每条语句末尾都要加分号,漏了也会报错。
编译和运行
把上面的代码保存为 hello.cpp,然后在命令行里执行:
g++ hello.cpp -o hello.exe
./hello.exe
第一行是编译命令。g++ 调用编译器,hello.cpp 是源文件,-o hello.exe 指定输出文件名。如果不写 -o,默认会生成 a.exe(Windows)或 a.out(Linux/macOS)。
第二行是运行程序。你应该会看到屏幕上打印出:
Hello, World!
嗯,就是这行简单的文字。但你知道吗?我第一次在屏幕上看到自己写的程序输出时,那种感觉真的很奇妙。虽然现在写了十几年 C++,每次编译通过、看到预期输出,心里还是会踏实一下。
四、本章知识体系
下面这张图,帮你把本章的核心脉络理清楚:
五、避坑指南
最后,分享几个我踩过的坑:
- 路径里有中文:我曾经把项目放在「桌面/我的代码」文件夹里,结果编译报错说找不到头文件。MinGW 对中文路径支持不太好,建议所有路径都用英文。
- 忘记加分号:这是 C++ 新手最常见的错误。编译器报错时,会提示你「expected ';' before ...」,看到这个就回去检查上一行末尾。
- main 函数写错:有人写成
mian、Main、int main漏了括号。记住:必须是int main(),小写,带括号。 - 编译命令输错:
g++不是gcc,-o是小写字母 o,不是数字 0。
好了,这一章的内容就到这里。你只要把 Hello World 跑通了,后面的路就好走了。C++ 的世界,从这一行输出开始。