C++ 基础语法
环境装好后,我们来系统过一遍 C++ 的基础语法。这一章不涉及复杂概念,只讲程序"长什么样"——结构、注释、命名规范、关键字、命名空间。读完你就能看懂任何 C++ 代码的大致框架。
一、C++ 程序的基本结构
一个可执行的 C++ 程序最少包含三部分:include 预处理指令、main 函数、返回值。看这个例子:
// 1. 预处理指令:引入标准库
#include <iostream>
#include <string>
// 2. 使用标准库名字空间(教程图省事这么写)
using namespace std;
// 3. 主函数:程序入口
int main() {
string name = "C++";
cout << "Hello, " << name << "!" << endl;
return 0; // 返回 0 表示正常退出
}
// 编译运行后输出: Hello, C++!!几个要点:
- 预处理指令:
include把指定头文件的内容在编译前"复制"到当前位置。C++ 标准库头文件不带.h后缀(老式 C 头文件才有,如stdio.h)。 - 名字空间:
using namespace std让你写cout而不必写std::cout。教程里图省事,生产代码推荐显式加前缀。 - main 函数:程序入口,每个 C++ 程序有且只有一个。必须返回
int。 - return 0:告诉操作系统程序正常退出。非 0 值表示异常。
二、注释
C++ 的注释规则和 C/Java/JS 完全一致:
// 这是单行注释,双斜杠开头,到行尾结束
/* 这是多行注释,
可以跨多行,
用斜杠星号包裹 */
/*
块注释常用于:
- 文件开头的版权/说明
- 临时禁用一大段代码
- 函数的详细说明
*/
// 现代注释规范:为函数、类、复杂逻辑写注释
// 解释"为什么",而不是"做了什么"——做了什么代码本身已经说明注释会被编译器完全忽略,只给人看。写注释的好习惯:
- 解释"为什么",而不是"做了什么":代码本身已经说明了"做了什么",注释的价值在于解释决策背后的原因。
- 和代码同步更新:过时的注释比没有注释更糟糕。
- 复杂逻辑必写:简单的赋值不用注释,但算法、业务规则一定要写。
三、分号与花括号
C++ 和 C/Java 一样,每条语句必须以分号结尾。一个语句可以跨多行,只要末尾有分号就行:
- 分号:标志一条语句结束。漏写分号是新手最常见的编译错误。
- 花括号:标志一个块(block),用于函数体、控制流、类体。花括号里的语句形成一个作用域。
- 空格与缩进:C++ 编译器不关心缩进(不像 Python)。但你必须保持一致的代码风格——用 Tab 或 4 个空格都行,选一个不要混用。推荐用 clang-format 工具自动格式化。
四、标识符命名规范
标识符是程序员自己起的名字(变量、函数、类型)。规则:
// 标识符命名规则:
// 1. 由字母、数字、下划线组成
// 2. 不能以数字开头
// 3. 区分大小写(age 和 Age 是两个变量)
// 4. 不能和关键字重名
int age = 20; // 合法
int _count = 0; // 合法(下划线开头)
int totalPrice = 99; // 合法(camelCase 驼峰命名)
int TotalPrice = 99; // 合法(PascalCase,通常用于类名)
// int 2nd = 1; // 非法:数字开头
// int my-var = 1; // 非法:含连字符
// int class = 1; // 非法:class 是关键字C++ 社区有几套流行的命名约定,主流的是:
- 变量名、函数名:camelCase 驼峰,如
totalCount、getUserInfo。 - 类名、结构体名:PascalCase 大驼峰,如
Student、HttpClient。 - 常量、宏:全大写+下划线,如
MAX_SIZE、PI。 - 成员变量:有的团队喜欢加
m_前缀(m_count)或尾部下划线(count_),用来和局部变量区分。
五、命名空间(namespace)
命名空间是 C++ 解决"命名冲突"的机制。比如你写了 log() 函数,别人也写了 log(),一起用就冲突。命名空间相当于给名字"加姓氏":
// 命名空间(namespace):避免命名冲突
// 比如两个库都有一个 log() 函数,用 namespace 隔离
namespace mylib {
int version = 2;
void log() {
cout << "mylib log" << endl;
}
}
namespace otherlib {
int version = 1;
void log() {
cout << "otherlib log" << endl;
}
}
int main() {
cout << mylib::version << endl; // 2
cout << otherlib::version << endl; // 1
mylib::log(); // mylib log
return 0;
}C++ 标准库所有内容都放在 std 名字空间里(读作"standard")。所以 cout 真名其实是 std::cout。:: 叫作用域解析运算符。
六、如何使用 std?
三种写法各有取舍:
// 标准库所有内容都在 std 名字空间里
// 三种使用方式:
// 方式 1:全部引入(教程常用,生产代码不推荐)
using namespace std;
cout << "hi" << endl;
// 方式 2:只引入需要的(推荐折中方案)
using std::cout;
using std::endl;
using std::string;
cout << "hi" << endl;
// 方式 3:每次都加前缀(最严谨,大型项目首选)
std::cout << "hi" << std::endl;- 方式 1(
using namespace std):教程里常用,代码短。但生产代码不推荐——容易和你自己的命名冲突,且看代码时不知道哪些是标准库、哪些是自定义。 - 方式 2(
using std::cout):折中方案,只引入需要的几个。 - 方式 3(
std::cout):最严谨,大型项目(Google C++ 风格)首选。看代码一目了然。
七、C++ 的关键字
C++ 关键字比 C 多得多(C 只有 32 个,C++17 有 95+ 个)。这是 C++ "庞大" 的根源之一,但常用的就二十来个。按用途分组记忆:
// C++ 关键字共约 95 个(C++17),不能用作标识符
// 按用途分组记忆更容易:
// 数据类型:int, char, bool, double, float, void,
// long, short, unsigned, signed, auto, wchar_t
// 变量声明:const, static, extern, mutable, constexpr,
// thread_local, register(已弃用), volatile
// 控制流:if, else, switch, case, default, for, while, do,
// break, continue, return, goto
// 函数与类型:struct, class, union, enum, typedef, using,
// virtual, override, final, friend, this,
// public, private, protected
// 面向对象:new, delete, operator, sizeof, typeid
// 异常:try, catch, throw, noexcept
// 模板:template, typename, requires(C++20)
// 命名空间:namespace
// 类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
// 其他:true, false, nullptr, alignof, alignas, decltype,
// static_assert, constexpr, asm不用全部背下来——用到的时候自然会记住。本系列每一篇都会介绍几个新关键字。
小结
这一章你了解了 C++ 程序的整体骨架:include → using namespace → main;知道了注释规则、分号花括号、命名规范;第一次接触了关键字和命名空间。下一篇我们看 C++ 的变量——这是写任何代码之前必须搞清楚的事。
← 上一篇 C++ 环境搭建
下一篇 C++ 变量 →