C++11之前关键字
基本类型关键字
-
int
:声明整数类型。int num = 42;
-
char
:声明字符类型。char c = 'A';
-
float
:声明单精度浮点数。float f = 3.14f;
-
double
:声明双精度浮点数。double d = 3.14159;
-
bool
(C++98 引入):声明布尔类型(true
/false
)。bool flag = true;
-
void
:表示无类型,用于函数返回值或指针。void func(); void* ptr;
-
wchar_t
:宽字符类型(用于 Unicode 字符)。wchar_t wc = L'あ';
类型修饰符
-
signed
:声明有符号类型(默认修饰符)。signed int num = -10;
-
unsigned
:声明无符号类型。unsigned int count = 100;
-
short
:声明短整型(比int
更小)。short s = 32767;
-
long
:声明长整型或双精度浮点型。long l = 100000L; long double ld = 3.1415926535L;
流程控制
-
if
/else
:条件分支。if (x > 0) { /*...*/ } else { /*...*/ }
-
switch
/case
/default
:多分支选择。switch (value) { case 1: break; default: break; }
-
for
:循环结构。for (int i=0; i<10; ++i) { /*...*/ }
-
while
:条件循环。while (cond) { /*...*/ }
-
do
:后测试循环。do { /*...*/ } while (cond);
-
break
:跳出循环或switch
。 -
continue
:跳过当前循环迭代。 -
goto
:跳转到标签(慎用)。goto label; label: /*...*/
-
return
:函数返回值。return 42;
存储类说明符
-
auto
(C++11 前):声明自动存储期的变量(局部变量默认)。auto int x = 10; // C++11 前有效
-
static
:- 函数内:静态局部变量(生命周期延长)。
- 类内:静态成员变量/函数。
- 全局:限制作用域到当前文件。
static int count = 0; // 文件作用域
-
extern
:声明外部链接的变量或函数。extern int globalVar; // 定义在其他文件
-
register
(已弃用):建议编译器将变量存储在寄存器中。register int i;
-
mutable
:允许在const
成员函数中修改成员变量。class A { mutable int cache; void func() const { cache = 42; } // 合法 };
类与面向对象
-
class
:定义类。class MyClass { /*...*/ };
-
struct
:定义结构体(默认成员公有)。struct Point { int x, y; };
-
union
:定义联合体(共享内存的成员)。union Data { int i; float f; };
-
private
/protected
/public
:访问控制修饰符。class A { private: int secret; public: void func(); };
-
friend
:声明友元(允许访问私有成员)。class B { friend class C; };
-
virtual
:声明虚函数或虚基类。virtual void func() = 0; // 纯虚函数
-
explicit
:禁止隐式构造函数转换。explicit MyClass(int x) { /*...*/ }
-
operator
:重载运算符。MyClass operator+(const MyClass& rhs);
异常处理
-
try
/catch
/throw
:异常处理机制。try { throw 42; } catch (int e) { /*...*/ }
模板与类型操作
-
template
:定义模板。template <typename T> class Box { /*...*/ };
-
typename
:声明模板中的依赖类型。template <typename T> void func() { typename T::NestedType x; // 必须使用 typename }
-
typeid
(需包含<typeinfo>
):获取类型信息。typeid(int).name();
类型转换
-
const_cast
:移除const
或volatile
修饰。const int x = 10; int* p = const_cast<int*>(&x);
-
dynamic_cast
:安全的向下转型(需多态类)。Base* b = new Derived(); Derived* d = dynamic_cast<Derived*>(b);
-
static_cast
:显式类型转换(编译时检查)。double d = 3.14; int i = static_cast<int>(d);
-
reinterpret_cast
:低层重新解释位模式(慎用)。int* p = reinterpret_cast<int*>(0x1234);
其他关键字
-
enum
:定义枚举类型。enum Color { RED, GREEN, BLUE };
-
typedef
:定义类型别名。typedef int Integer;
-
using
(C++11 前):引入命名空间或定义类型别名(C++11 扩展用法)。using namespace std; typedef using MyInt = int; // C++11 起支持
-
namespace
:定义命名空间。namespace MyNS { int x; }
-
asm
:内联汇编代码(编译器相关)。asm("mov eax, 42");
-
volatile
:禁止编译器优化(变量可能被外部修改)。volatile int sensorValue;
-
sizeof
:获取类型或对象的大小。sizeof(int); // 4(取决于平台)
-
new
/delete
:动态内存分配与释放。int* p = new int(42); delete p;
-
this
:指向当前对象的指针。void MyClass::func() { this->x = 42; }
-
const
:声明常量或常量成员函数。const int MAX = 100; void func() const; // 常量成员函数
-
export
(C++03 存在但极少支持):导出模板定义。export template <typename T> class A; // 极少使用
C++11
类型推导与类型操作
-
auto
(重新定义):
自动类型推导(根据初始化表达式推断变量类型)。auto x = 42; // int auto s = "hello"; // const char*
-
decltype
:
获取表达式的类型,保留const
和引用修饰。int x = 10; decltype(x) y = x; // y 的类型是 int decltype((x)) z = x; // z 的类型是 int&
-
nullptr
:
明确表示空指针(替代NULL
宏)。int* ptr = nullptr; // 避免与整数 0 混淆
常量表达式与编译时计算
-
constexpr
:
声明常量表达式(值或函数在编译时求值)。constexpr int square(int x) { return x * x; } constexpr int val = square(5); // 编译时计算
-
static_assert
:
编译时断言检查(直接验证条件,无需头文件)。static_assert(sizeof(int) == 4, "int must be 4 bytes");
类与继承控制
-
override
:
显式标记派生类中覆盖基类的虚函数。class Base { virtual void func(); }; class Derived : public Base { void func() override; // 明确表示覆盖 };
-
final
:
禁止类被继承,或虚函数被覆盖。class Base final {}; // 类不可继承 virtual void func() final; // 函数不可覆盖
移动语义与资源管理
-
noexcept
:
标记函数不会抛出异常(优化与安全)。void safe_func() noexcept { /* 保证不抛异常 */ }
-
default
(新用法):
显式生成默认构造函数/赋值函数。class MyClass { MyClass() = default; // 强制编译器生成默认构造 };
-
delete
(新用法):
显式删除函数(禁用特定构造函数或运算符)。class NonCopyable { NonCopyable(const NonCopyable&) = delete; };
内存对齐与多线程
-
alignas
:
指定变量或类型的对齐方式。alignas(16) int arr[4]; // 16 字节对齐
-
alignof
:
获取类型的对齐要求。int alignment = alignof(double); // 通常是 8
-
thread_local
:
声明线程局部存储变量(每个线程独立副本)。thread_local int counter = 0; // 每个线程独立
模板与类型别名
-
using
(新用法):
替代typedef
定义类型别名(更清晰的语法)。using Vec = std::vector<int>; // 等价于 typedef template<typename T> using Map = std::map<T, T>; // 支持模板
字面量后缀
-
用户定义字面量(通过后缀运算符):
// 定义自定义字面量 constexpr long double operator"" _km(long double d) { return d * 1000; } double distance = 5.0_km; // 5000 米
其他新增
-
char16_t
/char32_t
:
Unicode 字符类型(UTF-16 和 UTF-32)。char16_t c16 = u'字'; // UTF-16 char32_t c32 = U'字'; // UTF-32
-
_Alignas
/_Alignof
(C11 风格,不推荐使用):
同alignas
/alignof
,但 C++ 优先使用无下划线的版本。
核心语言特性增强
-
右值引用 (
&&
):
支持移动语义和完美转发(虽然不是关键字,但&&
符号是语法的一部分)。void func(int&& x); // 右值引用参数
-
Lambda 表达式:
匿名函数(通过[](){}
语法,无需新关键字)。auto add = [](int a, int b) { return a + b; };
总结
C++11 的关键字和特性使代码更简洁、安全、高效。例如:
auto
和decltype
简化了复杂类型的声明。nullptr
解决了NULL
的二义性问题。constexpr
将计算移至编译期,提升性能。- 移动语义(依赖
&&
和noexcept
)优化资源管理。
特殊值
true
/false
:布尔字面量。NULL
(非关键字,但常用):空指针常量(通常定义为0
)。
注意事项
- 部分关键字(如
auto
、register
)在 C++11 后语义改变或弃用。 export
在 C++03 中用于模板分离编译,但几乎没有编译器支持。mutable
和explicit
是 C++98 引入的关键字。
**C++14 **
C++14 未新增任何关键字,仅对现有关键字的功能进行了扩展和优化357。
主要扩展包括:
-
auto
-
允许用于函数返回值和 Lambda 表达式的参数推导。
auto func(auto a, auto b) { return a + b; } // 函数返回值与参数类型自动推导 auto lambda = [](auto x) { return x * 2; }; // Lambda 参数类型推导
-
-
constexpr
-
支持更复杂的编译期计算,允许函数内包含局部变量、循环和条件语句(需满足编译期可计算条件)。
constexpr int factorial(int n) { return (n <= 1) ? 1 : n * factorial(n-1); }
-
-
decltype
-
新增
decltype(auto)
,保留表达式的引用和常量性。int x = 10; decltype(x) y = x; // int 类型 decltype(auto) z = x; // int 类型(与 auto 不同,保留原始类型属性)
-
**C++17 **
C++17 同样未新增关键字,但通过以下扩展显著增强了语言功能268:
主要扩展包括:
-
constexpr
增强-
支持
if constexpr
,实现编译期条件分支优化,未选择的分支不会生成代码。template<typename T> void process(T value) { if constexpr (std::is_integral_v<T>) { /* 仅编译符合条件的代码 */ } }
-
允许 Lambda 表达式在
constexpr
上下文中使用。constexpr auto add = [](int a, int b) { return a + b; }; static_assert(add(2, 3) == 5); // 编译期计算
-
-
auto
扩展-
支持更复杂的类型推导规则,例如结构化绑定(需与
auto
结合使用)。std::pair<int, double> p{1, 3.14}; auto [x, y] = p; // x 为 int,y 为 double
-
-
inline
变量-
允许在头文件中定义全局变量,避免多重定义错误。
// test.h inline int global_num = 42; // 多文件包含时不会引发链接错误
-
-
typename
扩展-
允许在模板模板参数中使用
typename
替代class
(C++17 前仅支持class
)。template<template<typename> typename Container> // C++17 合法 class MyClass { /* ... */ };
-
C++14/17 的新语法特性(基于现有关键字)
-
结构化绑定(C++17)
-
使用
auto
解包复合类型(如元组、结构体)。std::tuple<int, std::string> t{42, "hello"}; auto [num, str] = t; // num=42, str="hello"
-
-
折叠表达式(C++17)
-
简化变参模板的参数展开(需结合运算符如
+
、*
)。template<typename... Args> auto sum(Args... args) { return (... + args); } // 右折叠求和
-
-
if
和switch
的初始化器(C++17)-
在条件语句中直接初始化变量。
if (auto it = m.find(key); it != m.end()) { /* 使用 it */ }
-
总结
- C++14:无新增关键字,但扩展了
auto
、constexpr
和decltype
的用法,优化了泛型编程和编译期计算。 - C++17:同样无新增关键字,但通过
if constexpr
、结构化绑定和折叠表达式等语法革新,显著提升了代码表达能力和性能268。 - 共同特点:均通过增强现有关键字的功能,减少了对新关键字的依赖,避免破坏向后兼容性。
C++20 新增关键字
-
concept
定义类型约束template<typename T> concept Integral = std::is_integral_v<T>; template<Integral T> void func(T t) {}
-
requires
指定模板参数约束template<typename T> requires std::integral<T> T add(T a, T b) { return a + b; }
-
constinit
强制变量在编译期初始化constinit static int x = 42; // 编译期初始化
-
consteval
声明函数必须在编译期执行consteval int square(int x) { return x * x; } int arr[square(3)]; // 必须编译期计算
-
co_await
/co_return
/co_yield
协程支持generator<int> sequence() { for (int i = 0; ; ++i) co_yield i; }
-
char8_t
UTF-8字符类型char8_t c8 = u8'a'; // UTF-8字符
-
import
/module
模块系统(替代头文件)// math.ixx export module math; export int add(int a, int b) { return a + b; } // main.cpp import math; int result = add(3, 4);
总结
- C++20 新增模块、概念、协程等重大特性,进一步简化代码并提升性能。
- 不同版本的关键字和特性需编译器支持(如 GCC/Clang 需开启
-std=c++20
)。