C++ 零基础入门学习指南:基础语法与核心特性详解
本文系统讲解 C++ 零基础入门知识,涵盖环境搭建(VS/CLion/GCC)、基础语法(变量、条件、循环、函数)、核心特性(面向对象、动态内存、STL)及实战项目(猜数字、计算器、LED 模拟)。重点强调分号规范、内存管理避坑及智能指针应用,适合希望掌握高性能开发、嵌入式或游戏开发基础的初学者。

本文系统讲解 C++ 零基础入门知识,涵盖环境搭建(VS/CLion/GCC)、基础语法(变量、条件、循环、函数)、核心特性(面向对象、动态内存、STL)及实战项目(猜数字、计算器、LED 模拟)。重点强调分号规范、内存管理避坑及智能指针应用,适合希望掌握高性能开发、嵌入式或游戏开发基础的初学者。

C++ 是在 C 语言基础上扩展的面向对象编程语言,2026 年仍是高性能开发、嵌入式、游戏引擎、金融高频交易的首选语言——简单说:
| 工具 | 作用 | 安装要点(白话版) |
|---|---|---|
| Visual Studio 2025 Community | Windows 首选 IDE(内置编译器 + 调试器) | 官网下载,勾选'桌面开发使用 C++'组件,一键安装 |
| CLion 2025.3(社区版/试用版) | 跨平台 C++ 编辑器(Mac/Windows/Linux 通用) | 新手友好,智能补全 + 调试方便,需搭配 MinGW/GCC |
| MinGW-w64 | C++ 编译器(Windows) | 下载安装后配置环境变量,验证 g++ --version |
| GCC 14(Linux)/Clang 18(Mac) | 系统自带编译器 | Linux:sudo apt install g++;Mac:xcode-select --install |
| CMake 3.30 | 跨平台构建工具(企业项目必备) | 官网下载,配置环境变量,验证 cmake --version |
打开命令行(CMD/Terminal),输入以下命令,能输出版本号就是成功:
# 查看编译器版本(主流 GCC 14/Clang 18/VS 2025)
g++ --version # Windows(MinGW)/Linux
clang++ --version # Mac
# 输出示例:g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 14.1.0
// 单行注释:C++ 的第一个程序
/* 多行注释:C++ 程序结构:头文件→主函数 main 函数是程序唯一入口 */
// 包含输入输出头文件(C++23 仍需显式包含)
#include <iostream>
// 使用 std 命名空间(避免每次写 std::cout)
using namespace std;
// 主函数:int 表示返回值类型,main() 是固定入口
int main() {
// 输出到控制台(cout 是输出流,<< 是流插入符)
cout << "你好,C++23!" << endl;
// 返回 0 表示程序正常结束(C++ 要求 main 返回 int)
return 0;
}
# 方式 1:命令行编译 + 运行(通用)
g++ hello.cpp -o hello # 编译生成可执行文件 hello
./hello # Windows:hello.exe 运行
# 方式 2:IDE 运行(新手推荐)
# Visual Studio/CLion 中右键→编译并运行
控制台输出:你好,C++23!
.cpp(也可用 .cc/.cxx);#include <头文件名> 引入,iostream 是标准输入输出头文件;std 是 C++ 标准库的命名空间,using namespace std 简化代码(新手推荐,企业项目可按需指定 std::cout);{} 包裹,分号 ; 是语句结束符(必须加)(和 Python/Go 的核心区别);main() 函数必须返回 int,返回 0 表示正常结束,非 0 表示异常。| 类型 | 用途 | 占用内存(64 位系统) | 示例 |
|---|---|---|---|
| int | 整数(年龄、分数、数量) | 4 字节 | int age = 18; |
| double | 双精度小数(工资、精度要求高的数值) | 8 字节 | double salary = 8000.5; |
| float | 单精度小数(性能优先场景) | 4 字节 | float height = 1.75f; |
| char | 字符(单个字母/数字) | 1 字节 | char ch = 'A'; |
| bool | 布尔值(真假) | 1 字节 | bool is_adult = true; |
| string | 字符串(C++ 标准库类型) | 动态分配 | string name = "小明"; |
#include <iostream>
#include <string>
// 使用 string 必须包含此头文件
using namespace std;
int main() {
// 声明变量:类型 变量名 = 初始值;(C++ 要求先声明后使用)
int age = 18;
double score = 92.5;
char gender = 'M';
bool is_pass = score >= 60;
string name = "小明";
// 一行声明多个同类型变量
int a = 1, b = 2, c = 3;
// 输出变量(混合文本和变量)
cout << "姓名:" << name << endl;
cout << "年龄:" << age << ",成绩:" << score << endl;
cout << "是否及格:" << boolalpha << is_pass << endl;
// boolalpha:输出 true/false(否则 1/0)
// 变量赋值
age = 19;
// 重新赋值
cout << "修改后的年龄:" << age << endl;
return 0;
}
float 类型赋值需加 f 后缀(1.75f),否则默认是 double;string 是 C++ 标准库类型,不是原生类型,必须包含 <string> 头文件;int x;,x 的值随机),企业开发必须初始化。#include <iostream>
using namespace std;
int main() {
double score = 85;
// if 条件必须加 (),代码块用 {}
if (score >= 90) {
cout << "优秀" << endl;
} else if (score >= 60) {
// 注意:else if 连写,无空格
cout << "及格" << endl;
} else {
cout << "不及格" << endl;
}
// 三元运算符(简化 if/else)
string result = (score >= 60) ? "及格" : "不及格";
cout << "结果:" << result << endl;
return 0;
}
() 包裹,代码块 {} 不能省略(即使只有一行);条件 ? 表达式 1 : 表达式 2,表达式 1/2 类型需一致;if constexpr(编译期条件判断),新手先掌握基础 if/else 即可。#include <iostream>
using namespace std;
int main() {
// 标准 for 循环:初始化; 条件; 自增
for (int i = 1; i <= 10; i++) {
cout << i << " ";
}
cout << endl;
// 计算 1-100 的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i; // 等价于 sum = sum + i
}
cout << "1-100 的和:" << sum << endl; // 输出 5050
// C++11+ 范围 for 循环(遍历数组/容器)
int scores[] = {80, 90, 85, 95}; // 数组
for (int s : scores) {
// 遍历数组每个元素
cout << s << " ";
}
cout << endl;
return 0;
}
#include <iostream>
using namespace std;
int main() {
// while 循环:先判断后执行
int i = 1;
while (i <= 5) {
cout << i << " ";
i++;
}
cout << endl;
// do-while 循环:先执行后判断(至少执行一次)
int j = 6;
do {
cout << j << " ";
j++;
} while (j <= 5); // 条件不满足,但仍执行一次
cout << endl;
return 0;
}
for (int i = 0; i < n; i++) 是 C++ 最经典的循环写法,数组/容器遍历优先用;for (auto x : container))是 C++11 新增,简化遍历,企业项目广泛使用;break 终止循环,continue 跳过当前次循环,goto(慎用,仅底层开发用)。#include <iostream>
#include <string>
using namespace std;
// 函数声明(可选,若函数定义在 main 后需声明)
double calculate_avg(int scores[], int length);
// 函数定义:返回值类型 函数名 (参数类型 参数名) { 代码 }
double calculate_avg(int scores[], int length) {
/* 计算数组平均分
* @param scores: 分数数组
* @param length: 数组长度
* @return: 平均分
*/
if (length <= 0) {
return 0.0;
}
int sum = 0;
for (int i = 0; i < length; i++) {
sum += scores[i];
}
return (double)sum / length; // 强制类型转换(int→double)
}
// 带默认参数的函数(C++ 特色)
void say_hello(string name = "陌生人") {
cout << "你好," << name << "!" << endl;
}
int main() {
// 调用函数
int scores[] = {80, 90, 85, 95};
int len = sizeof(scores) / sizeof(scores[0]); // 计算数组长度
double avg = calculate_avg(scores, len);
cout << "平均分:" << avg << endl;
// 默认参数调用
say_hello(); // 输出:你好,陌生人!
say_hello("小明"); // 输出:你好,小明!
return 0;
}
返回值类型 函数名 (参数列表) { 函数体 },无返回值用 void;void func(int a, int b=10) 合法,void func(int a=10, int b) 非法);#include <iostream>
using namespace std;
int main() {
// 数组声明:类型 数组名 [长度] = {初始值};
int arr[5] = {1, 2, 3, 4, 5}; // 定长数组,长度固定
// 访问数组元素(索引从 0 开始)
cout << "第一个元素:" << arr[0] << endl;
cout << "最后一个元素:" << arr[4] << endl;
// 数组遍历(推荐用 for 循环)
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 注意:数组越界(访问 arr[5])会导致未定义行为(程序崩溃/数据错乱)
return 0;
}
#include <iostream>
#include <string> // 必须包含
using namespace std;
int main() {
// string 初始化
string str1 = "Hello C++";
string str2("2023");
string str3 = str1 + " " + str2; // 字符串拼接
// 字符串操作
cout << "字符串长度:" << str3.size() << endl; // 输出:11
cout << "子串:" << str3.substr(0, 5) << endl; // 截取前 5 个字符:Hello
cout << "查找字符:" << str3.find("C++") << endl; // 查找位置:6
// 字符串修改
str1.append("23"); // 追加:Hello C++23
str1[0] = 'h'; // 修改第一个字符:hello C++23
cout << str1 << endl;
return 0;
}
std::vector(动态数组);std::string 是 C++ 标准库字符串,支持拼接、截取、查找等操作,比 C 语言 char* 更安全、易用;string 的 size()/length() 等价,均返回字符串长度。C 语言是'面向过程',C++ 的核心是'面向对象'——把数据和操作数据的函数封装成'类',比如 Student 类包含姓名、年龄(数据)和计算成绩、打印信息(函数),代码更易复用、易维护。
#include <iostream>
#include <string>
using namespace std;
// 定义类(class 关键字,首字母大写)
class Student {
public:
// 访问修饰符:public 表示外部可访问
// 成员变量(属性)
string name;
int age;
double score;
// 成员函数(方法):打印学生信息
void print_info() {
cout << "姓名:" << name << ",年龄:" << age << ",成绩:" << score << endl;
}
// 成员函数:计算是否及格
bool is_pass() {
return score >= 60;
}
};
int main() {
// 创建对象(实例化类)
Student stu1;
// 给对象赋值
stu1.name = "小明";
stu1.age = 18;
stu1.score = 90.0;
// 调用成员函数
stu1.print_info();
cout << "是否及格:" << boolalpha << stu1.is_pass() << endl;
return 0;
}
public(外部可访问)、private(仅类内部可访问)、protected(继承场景用);private,通过 public 成员函数(get/set)访问(封装);C++ 允许手动管理内存——new 申请内存,delete 释放内存,这是 C++ 高性能的核心,但也是新手最容易出错的地方(内存泄漏/野指针)。
#include <iostream>
#include <string>
using namespace std;
int main() {
// 动态申请单个变量(new)
int* p_age = new int(18); // 申请 int 内存,初始值 18,返回指针
double* p_score = new double(92.5);
cout << "年龄:" << *p_age << endl; // 解引用指针
cout << "成绩:" << *p_score << endl;
// 动态申请数组
int* p_arr = new int[5]{1, 2, 3, 4, 5}; // 动态数组
for (int i = 0; i < 5; i++) {
cout << p_arr[i] << " ";
}
cout << endl;
// 释放内存(必须!否则内存泄漏)
delete p_age; // 释放单个变量
delete p_score;
delete[] p_arr; // 释放数组(必须加 [])
// 避免野指针:释放后置空
p_age = nullptr;
p_score = nullptr;
p_arr = nullptr;
return 0;
}
new 申请的内存必须用 delete 释放(数组用 delete[]),否则会导致内存泄漏;nullptr(C++11+),避免野指针访问;std::unique_ptr/std::shared_ptr)替代裸指针,减少内存错误。STL 是 C++ 的'宝藏库',包含容器、算法、迭代器,企业项目 90% 的场景用 STL 替代原生数组/函数——vector 是最常用的动态数组,长度可自动扩容,比原生数组安全、易用。
#include <iostream>
#include <vector> // 包含 vector 头文件
using namespace std;
int main() {
// 创建 vector(动态数组)
vector<int> vec; // 空 vector
// 添加元素(自动扩容)
vec.push_back(80);
vec.push_back(90);
vec.push_back(85);
// 访问元素(和数组一样)
cout << "第一个元素:" << vec[0] << endl;
cout << "最后一个元素:" << vec.back() << endl;
// STL 特色方法
// 遍历 vector(三种方式,主流)
// 方式 1:索引遍历
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// 方式 2:范围 for 循环(C++11+)
for (int num : vec) {
cout << num << " ";
}
cout << endl;
// 方式 3:迭代器(STL 标准方式)
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
cout << *it << " ";
}
cout << endl;
// 常用操作
vec.pop_back(); // 删除最后一个元素
cout << "删除后长度:" << vec.size() << endl; // 输出 2
return 0;
}
vector 是动态数组,push_back() 尾部添加元素,pop_back() 尾部删除;size() 返回元素个数,empty() 判断是否为空;容器类型::iterator,begin() 指向第一个元素,end() 指向最后一个元素的下一个位置。#include <iostream>
#include <cstdlib> // rand()/srand()
#include <ctime> // time()
using namespace std;
int main() {
// 设置随机数种子
srand((unsigned int)time(nullptr));
// 生成 1-100 的随机数
int target = rand() % 100 + 1;
int guess;
int count = 0;
cout << "欢迎来到猜数字游戏!" << endl;
cout << "请猜 1-100 之间的数字:" << endl;
while (true) {
cin >> guess;
count++;
if (guess < target) {
cout << "太小了,再猜猜!" << endl;
} else if (guess > target) {
cout << "太大了,再猜猜!" << endl;
} else {
cout << "恭喜你猜对了!总共猜了" << count << "次" << endl;
break;
}
}
return 0;
}
rand() 生成随机数,需用 srand(time(nullptr)) 设置种子,否则每次随机数相同;rand() % 100 + 1 生成 1-100 的随机数(% 100 生成 0-99,+1 后 1-100);cin 是输入流,接收用户输入,是控制台程序的核心交互方式。#include <iostream>
using namespace std;
// 加法函数
double add(double a, double b) {
return a + b;
}
// 减法函数
double subtract(double a, double b) {
return a - b;
}
// 乘法函数
double multiply(double a, double b) {
return a * b;
}
// 除法函数(处理除零错误)
double divide(double a, double b) {
if (b == 0) {
cout << "错误:除数不能为 0!" << endl;
return 0;
}
return a / b;
}
int main() {
double num1, num2;
char op;
bool exit = false;
cout << "简易计算器(支持 +、-、*、/,输入 q 退出)" << endl;
while (!exit) {
cout << "请输入表达式(如:1+2):";
cin >> num1 >> op >> num2;
double result;
switch (op) {
// 分支语句,替代多 if/else
case '+': result = add(num1, num2); break;
case '-': result = subtract(num1, num2); break;
case '*': result = multiply(num1, num2); break;
case '/': result = divide(num1, num2); break;
case 'q': exit = true; cout << "计算器退出!" << endl; continue;
default: cout << "错误:无效运算符!" << endl; continue;
}
if (!exit) {
cout << "结果:" << num1 << op << num2 << "=" << result << endl;
}
}
return 0;
}
switch 语句适合多分支判断(运算符、状态码),break 终止当前分支;exit 变量),提升用户体验。#include <iostream>
#include <chrono> // 时间库
#include <thread> // 线程库
using namespace std;
// LED 类(模拟嵌入式 LED)
class LED {
private:
bool status; // LED 状态:true 亮,false 灭
string name; // LED 名称
public:
// 构造函数:初始化 LED
LED(string n) : name(n), status(false) {}
// 点亮 LED
void on() {
status = true;
cout << name << " LED 亮" << endl;
}
// 熄灭 LED
void off() {
status = false;
cout << name << " LED 灭" << endl;
}
// 闪烁 LED(间隔 1 秒)
void blink(int times) {
for (int i = 0; i < times; i++) {
on();
this_thread::sleep_for(chrono::seconds(1)); // 休眠 1 秒
off();
this_thread::sleep_for(chrono::seconds(1));
}
}
};
int main() {
// 创建 LED 对象
LED led1("红灯");
cout << "LED 闪烁模拟(5 次):" << endl;
led1.blink(5);
return 0;
}
g++ led.cpp -o led -std=c++23 -pthread # -pthread 链接线程库
./led
LED(string n) : name(n), status(false))是 C++ 初始化成员变量的高效方式;chrono/thread 是 C++11+ 线程库,模拟嵌入式延时操作;vector;new 和 delete 成对使用,数组用 delete[];cout/printf → ✅ 新手统一用 cout,避免输出格式错误;string/vector 必须包含对应头文件;-std=c++23,启用新特性。new/delete,进阶后学智能指针。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online