类型与变量
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; // 推导为 doubleauto 让编译器推导类型,减少冗余、避免截断错误。但函数接口处显式写类型更清晰。
引用与指针
引用是别名,必须初始化且不可重绑;指针可空、可重指。现代 C++ 优先用引用与智能指针,裸指针仅作"观测"。
int x = 10;
int& r = x; // r 是 x 的别名
r = 20; // 等价于 x = 20
int* p = &x; // p 指向 x
*p = 30;函数参数若"必存在且不转移所有权",用 const T& 传引用避免拷贝;需要可选/共享所有权才用指针或智能指针。
const 正确性
const 表示"不可修改"。从右往左读:const int* 指向常量的指针,int* const 常量指针。尽量给不变量加 const。
const std::string name = "Bob"; // 不可改
void print(const std::string& s); // 承诺不修改 sconst 主要表达意图与不变式、帮编译器与读者;它不直接产生优化,但能让错误在编译期暴露。
函数与重载
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); // 默认参数控制流
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++ 少一次拷贝,养成前置习惯。
命名空间
命名空间避免名字冲突。用 namespace 包裹代码,using namespace 在头文件中慎用(会污染全局)。
namespace math {
constexpr double pi = 3.1415926;
double area(double r) { return pi * r * r; }
}
double a = math::area(2.0);编译模型
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 防止重复包含导致重定义。
常见陷阱与 FAQ
不一定。标准只规定相对大小(long 不短于 int)。跨平台数值用 int32_t/int64_t 等定宽类型保证一致。
返回指向局部变量的引用/指针是未定义行为(悬垂引用)。返回引用只适用于"指代调用方仍在生命周期内的对象"(如成员、静态、参数)。
auto 通常去掉引用与 const(按值拷贝)。要保留用 auto&/const auto& / auto&&(转发引用)。