第一章:C++基础——从零开始,搭建你的第一块基石
大家好,我是你们这门课的向导。说实话,每次开始讲一门新语言,我都会想起自己当年第一次在屏幕上打出“Hello World”时的情景。那种感觉,就像你刚拿到一把瑞士军刀,虽然还不知道它能干多少事,但心里已经痒痒的了。
这一章,我们不谈高深的理论,就踏踏实实地把地基打好。你想想看,盖房子最怕什么?最怕地基没打牢,后面装修得再漂亮也白搭。C++和Qt的学习也是一样。咱们先把C++的“前世今生”搞清楚,再把开发环境搭好,最后亲手跑起第一个程序。嗯,就这么简单。
1.1 C++的历史:它从哪里来,要到哪里去?
C++诞生于1983年,它的父亲是Bjarne Stroustrup。当时他在贝尔实验室工作,觉得C语言虽然强大,但写大型项目时管理起来太痛苦了。于是他在C语言的基础上,加入了“类”的概念——这就是C++名字的由来:C加加,就是C语言的升级版。
我个人习惯把C++的发展分成几个阶段:
- C++98/03:经典时代。这是第一个国际标准,很多老项目还在用这个标准写。
- C++11:现代C++的起点。引入了auto、智能指针、lambda表达式等。我当年从C++98迁移到C++11时,感觉就像从自行车换成了摩托车。
- C++14/17/20:持续进化。尤其是C++17,文件系统库、并行算法这些特性,让写跨平台程序方便了很多。
- C++23及以后:未来已来。模块化、协程等新特性正在改变我们写代码的方式。
核心观点:C++是一门“不抛弃、不放弃”的语言。它兼容C语言,同时又不断吸收现代编程语言的优点。你学好了C++,再去看其他语言,会发现很多概念都是相通的。
为什么会这样?因为C++的设计哲学就是“零开销抽象”——你不需要为没用到的特性付出性能代价。这一点在嵌入式开发、游戏引擎、高频交易等领域特别重要。我在项目中遇到过好几次,用Java或Python搞不定的性能瓶颈,换成C++就轻松解决了。
1.2 开发环境搭建:工欲善其事,必先利其器
搭建开发环境,说白了就是给你的电脑装上“翻译官”,让它能看懂你写的C++代码。这里我推荐两种主流方案,你可以根据自己的喜好选择。
方案一:MinGW + VS Code(轻量级,适合初学者)
MinGW是Windows上的GCC编译器。VS Code是微软出品的免费编辑器,轻巧灵活。
- 下载MinGW:去官网下载MinGW-w64安装包。安装时注意选择架构为x86_64,线程模型为posix。
- 配置环境变量:把MinGW的bin目录(比如C:\mingw64\bin)添加到系统的PATH环境变量中。
- 安装VS Code:去code.visualstudio.com下载安装。
- 安装C++扩展:在VS Code的扩展商店里搜索“C/C++”,安装微软官方提供的那个扩展。
- 验证安装:打开命令行,输入
g++ --version,如果能看到版本号,说明安装成功。
小技巧:我个人习惯在VS Code里再装一个“Code Runner”扩展。这样写代码时,右键就能直接运行,不用每次都手动敲编译命令,省事不少。
方案二:Qt Creator(集成开发环境,适合Qt项目)
如果你打算深入学习Qt,直接用Qt Creator会更方便。它自带编译器、调试器,还集成了Qt的设计师工具。
- 下载Qt:去qt.io下载Qt在线安装包。安装时选择你需要的Qt版本(比如6.5)和编译器(MinGW或MSVC)。
- 安装:一路默认即可。安装过程比较长,建议泡杯茶慢慢等。
- 打开Qt Creator:新建一个项目,选择“Qt Console Application”或“Qt Widgets Application”,就能开始写代码了。
避坑指南:我曾经在安装Qt时,因为路径里带了中文,导致编译死活过不去。后来才发现是编码问题。所以,安装路径里千万不要出现中文或空格!
1.3 第一个C++程序:Hello, World!
好了,环境搭好了,我们来写第一个程序。这是编程界的“传统仪式”,就像学书法先写“永”字一样。
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
这段代码干了三件事:
#include <iostream>:告诉编译器,我们要用输入输出流库。说白了,就是让程序能“说话”。int main():程序的入口。每个C++程序都必须有一个main函数,就像每部电影都得有个开头。std::cout << "Hello, World!" << std::endl;:把字符串输出到控制台。std::endl表示换行。
编译运行:在命令行里输入g++ hello.cpp -o hello,然后执行./hello(Windows上是hello.exe)。如果看到屏幕上打印出“Hello, World!”,恭喜你,你已经迈出了第一步。
注意:main函数的返回值是int类型,返回0表示程序正常结束。如果你不写return 0,编译器会自动帮你加上。但我建议你养成显式写return的习惯,这样代码更清晰。
1.4 基本语法:C++的“单词”和“句子”
学语法,就像学一门新语言的单词和造句规则。C++的语法其实不复杂,咱们先看几个最核心的。
变量与数据类型
变量就是用来存数据的“盒子”。C++是静态类型语言,意思是每个盒子在创建时就要告诉它里面装什么类型的东西。
int age = 25; // 整数
double price = 19.99; // 浮点数(带小数)
char grade = 'A'; // 单个字符
bool isReady = true; // 布尔值(真/假)
std::string name = "Alice"; // 字符串(需要包含 <string> 头文件)
你想想看,为什么要有这么多类型?因为不同类型占用的内存大小不一样,运算方式也不一样。比如整数和浮点数在内存里的存储方式就完全不同。
控制流:让程序学会“思考”
程序不是一条路走到黑的。它需要根据条件做选择,或者重复做某件事。
// if-else 条件判断
int score = 85;
if (score >= 60) {
std::cout << "及格了" << std::endl;
} else {
std::cout << "不及格" << std::endl;
}
// for 循环
for (int i = 0; i < 5; i++) {
std::cout << "这是第 " << i << " 次循环" << std::endl;
}
// while 循环
int count = 0;
while (count < 3) {
std::cout << "count = " << count << std::endl;
count++;
}
我在项目中遇到过最经典的坑:在for循环里不小心把i < 5写成了i <= 5,结果数组越界,程序崩溃了。这种错误很难查,因为编译不会报错,只有运行时才会暴露。所以,写循环时一定要小心边界条件。
函数:把代码“打包”
函数就是把一段代码打包成一个“工具”,需要的时候随时调用。
// 定义一个函数,计算两个数的和
int add(int a, int b) {
return a + b;
}
// 调用函数
int result = add(3, 5);
std::cout << "3 + 5 = " << result << std::endl;
函数的优点很明显:代码复用、逻辑清晰。你想想看,如果你要在一个程序里多次计算两个数的和,难道每次都写一遍a + b吗?当然不,写一个函数,一劳永逸。
1.5 命名空间:避免“撞名”的智慧
命名空间,说白了就是给代码加个“姓氏”。比如你叫“张三”,我也叫“张三”,那在同一个班里就分不清了。但如果我叫“一班张三”,你叫“二班张三”,就清楚了。
C++里最常用的命名空间就是std,标准库里的所有东西都在这个命名空间里。
// 方式一:每次都写 std::
std::cout << "Hello" << std::endl;
// 方式二:使用 using 声明
using std::cout;
using std::endl;
cout << "Hello" << endl;
// 方式三:使用 using namespace(不推荐在头文件中使用)
using namespace std;
cout << "Hello" << endl;
避坑指南:我曾经在一个大型项目里,看到有人直接在头文件里写了using namespace std;,结果导致整个项目里到处都是命名冲突,排查了整整一天。所以,我的建议是:在源文件(.cpp)里可以用using namespace,但在头文件(.h)里绝对不要用!
你也可以自己定义命名空间:
namespace MyUtils {
int add(int a, int b) {
return a + b;
}
}
// 使用时
int result = MyUtils::add(10, 20);
这样,即使别人也写了一个叫add的函数,只要放在不同的命名空间里,就不会冲突。
知识体系总览
下面这张图,帮你把这一章的核心知识点串起来。你可以把它当作一张“地图”,随时回来看看自己走到了哪里。
好了,这一章的内容就到这里。你可能会觉得知识点有点多,但别急,编程这东西,就是“熟能生巧”。多写几行代码,多踩几个坑,自然就记住了。