C++ 开发手册C++

CHAPTER 01基础层 · BASICS

语法基础

类型、控制流、函数、引用、const、命名空间与编译模型。理解值语义与零开销抽象,是写好现代 C++ 的地基。

开始阅读难度入门先修编程基础约2.5小时
01.1

类型与变量

C++ 是静态强类型语言:int/long/double/bool/char 等基础类型,大小依平台略有差异,用 <cstdint> 的定宽类型更可移植。

#include <cstdint>
int32_t a = 42;          // 明确 32 位有符号
double pi = 3.14159;
auto b = 10;            // 推导为 int
auto c = 10.0;          // 推导为 double
auto 的使用auto 让编译器推导类型,减少冗余、避免截断错误。但函数接口处显式写类型更清晰。

01.2

引用与指针

引用是别名,必须初始化且不可重绑;指针可空、可重指。现代 C++ 优先用引用与智能指针,裸指针仅作"观测"。

int x = 10;
int& r = x;            // r 是 x 的别名
r = 20;                // 等价于 x = 20
int* p = &x;          // p 指向 x
*p = 30;
优先引用

函数参数若"必存在且不转移所有权",用 const T& 传引用避免拷贝;需要可选/共享所有权才用指针或智能指针。

01.3

const 正确性

const 表示"不可修改"。从右往左读:const int* 指向常量的指针,int* const 常量指针。尽量给不变量加 const。

const std::string name = "Bob";   // 不可改
void print(const std::string& s); // 承诺不修改 s
const 不是性能开关

const 主要表达意图与不变式、帮编译器与读者;它不直接产生优化,但能让错误在编译期暴露。

01.4

函数与重载

C++ 支持函数重载(同名不同参数)、默认参数、内联。参数默认传值,大对象用 const 引用。

int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }  // 重载
void log(const std::string& msg, int level = 0);   // 默认参数
01.5

控制流

if/switch、for/while/do-while 是基础;C++11 起支持基于范围的 for(range-based for)遍历容器。

for (int i = 0; i < 10; ++i) { }
std::vector<int> v = {1, 2, 3};
for (const auto& x : v) {        // 推荐:避免拷贝
  std::cout << x;
}
前置 ++

对迭代器/自定义类型,++i 比 i++ 少一次拷贝,养成前置习惯。

01.6

命名空间

命名空间避免名字冲突。用 namespace 包裹代码,using namespace 在头文件中慎用(会污染全局)。

namespace math {
  constexpr double pi = 3.1415926;
  double area(double r) { return pi * r * r; }
}
double a = math::area(2.0);
01.7

编译模型

C++ 是"分别编译":每个 .cpp 是翻译单元,独立编译成目标文件,再由链接器合并。声明放头文件(.h),定义放实现文件(.cpp)。

// math.h
double area(double r);          // 声明
// math.cpp
double area(double r) { return 3.14 * r * r; }  // 定义
头文件守卫

头文件用 #pragma once 或 include guard 防止重复包含导致重定义。

01.8

常见陷阱与 FAQ

int 和 long 大小一样吗?

不一定。标准只规定相对大小(long 不短于 int)。跨平台数值用 int32_t/int64_t 等定宽类型保证一致。

返回引用有风险?

返回指向局部变量的引用/指针是未定义行为(悬垂引用)。返回引用只适用于"指代调用方仍在生命周期内的对象"(如成员、静态、参数)。

auto 会丢失 const/引用吗?
auto 通常去掉引用与 const(按值拷贝)。要保留用 auto&/const auto& / auto&&(转发引用)。

01.9

实战练习与资源

延伸资源