C++ 关键字分类及详解
C++ 的关键字可以根据其功能大致分为以下几类:
-
数据类型相关
int
: 整型,用于表示整数。float
: 单精度浮点型,用于表示小数。double
: 双精度浮点型,比float
精度更高。char
: 字符型,用于表示单个字符。bool
: 布尔型,表示真 (true) 或假 (false)。void
: 无类型,常用于函数无返回值或泛型指针。short
: 短整型, 通常占用比int更小的空间。long
: 长整型, 通常占用比int更大的空间。signed
: 有符号, 可以表示正数、负数和零 (通常是整数类型的默认值)。unsigned
: 无符号, 只能表示非负数 (零和正数)。wchar_t
: 宽字符型,用于表示宽字符(如 Unicode 字符)。
#include <iostream> int main() { int age = 30; float price = 9.99f; // 注意 float 类型常数后加 f double pi = 3.14159265358979323846; char grade = 'A'; bool isPassed = true; wchar_t wideChar = L'中'; // 宽字符示例 std::cout << "Age: " << age << std::endl; std::cout << "Price: " << price << std::endl; std::cout << "Pi: " << pi << std::endl; std::cout << "Grade: " << grade << std::endl; std::cout << "Passed: " << isPassed << std::endl; std::cout << "Wide Char: " << wideChar << std::endl; short smallNumber = 32767; long largeNumber = 2147483647; unsigned int positiveNumber = 4294967295; std::cout << "short: " << smallNumber << std::endl; std::cout << "long: " << largeNumber << std::endl; std::cout << "unsigned int: " << positiveNumber << std::endl; return 0; }
-
存储类别/生命周期相关
auto
: 自动类型推断 (C++11 及以后),或早期版本中的自动存储类别。static
: 静态存储,变量的生命周期为整个程序运行期间。extern
: 声明一个变量或函数在其他地方定义。register
: 建议编译器将变量存储在寄存器中 (现代编译器通常会忽略)。mutable
: 用于修饰类的成员变量,表示即使在const
成员函数中也可以修改。thread_local
(C++11): 指示变量具有线程存储期。每个线程拥有该变量的一个实例。
#include <iostream> // 全局变量 int globalVar = 10; void myFunction() { // 静态局部变量 static int staticVar = 0; staticVar++; std::cout << "Static variable: " << staticVar << std::endl; } // 声明一个在其他文件中定义的变量 extern int externalVar; int main() { // 自动类型推断 (C++11) auto x = 5; // x 被推断为 int auto y = 3.14; // y 被推断为 double myFunction(); // 输出 Static variable: 1 myFunction(); // 输出 Static variable: 2 std::cout << "External variable: " << externalVar << std::endl; // 需要有其他文件定义 externalVar return 0; } // 在另一个文件 (e.g., another.cpp) 中定义: // int externalVar = 20;
-
控制流相关
if
: 条件语句。else
: 与if
配合使用。switch
: 多分支选择语句。case
:switch
语句中的分支标签。default
:switch
语句中的默认分支。while
: 循环语句。do
: 与while
配合使用,构成 do-while 循环。for
: 循环语句。break
: 跳出循环或switch
语句。continue
: 跳过当前循环迭代,继续下一次迭代。goto
: 无条件跳转 (不推荐使用)。return
: 从函数返回值。
#include <iostream> int main() { int num = 10; // if-else 语句 if (num > 0) { std::cout << "Positive number" << std::endl; } else if (num < 0) { std::cout << "Negative number" << std::endl; } else { std::cout << "Zero" << std::endl; } // switch 语句 int day = 3; switch (day) { case 1: std::cout << "Monday" << std::endl; break; case 2: std::cout << "Tuesday" << std::endl; break; case 3: std::cout << "Wednesday" << std::endl; break; default: std::cout << "Other day" << std::endl; } // while 循环 int i = 0; while (i < 5) { std::cout << i << " "; i++; } std::cout << std::endl; // do-while 循环 int j = 0; do { std::cout << j << " "; j++; } while (j < 5); std::cout << std::endl; // for 循环 for (int k = 0; k < 5; k++) { std::cout << k << " "; } std::cout << std::endl; // break 和 continue for (int l = 0; l < 10; l++) { if (l == 5) { break; // 跳出循环 } if (l % 2 == 0) { continue; // 跳过偶数 } std::cout << l << " "; // 只输出奇数 } std::cout << std::endl; return 0; }
-
运算符相关
sizeof
: 获取数据类型或变量的大小 (以字节为单位)。new
: 动态分配内存。delete
: 释放动态分配的内存。this
: 指向当前对象的指针 (在成员函数中使用)。typeid
: 返回关于表达式类型的 std::type_info 对象const_cast
: 移除或添加 const、volatile 和 __unaligned 属性dynamic_cast
: 安全地将指向基类的指针或引用转换为指向派生类的指针或引用reinterpret_cast
: 执行低级别转换,例如将指针转换为整数,或者将一种指针类型转换为另一种不相关的指针类型。static_cast
: 执行相关类型之间的转换,例如在数字类型之间,或者在基类和派生类指针之间(不需要运行时检查)。
#include <iostream> #include <typeinfo> class MyClass { public: int x; void printThis() { std::cout << "this pointer: " << this << std::endl; } }; int main() { int num = 10; // sizeof 运算符 std::cout << "Size of int: " << sizeof(int) << " bytes" << std::endl; std::cout << "Size of num: " << sizeof(num) << " bytes" << std::endl; // new 和 delete 运算符 int* ptr = new int; // 动态分配一个 int *ptr = 20; std::cout << "Value at ptr: " << *ptr << std::endl; delete ptr; // 释放内存 // this 指针 MyClass obj; obj.x = 5; obj.printThis(); std::cout << "Address of obj: " << &obj << std::endl; // typeid 运算符 std::cout << "Type of num: " << typeid(num).name() << std::endl; // 各种 cast // const_cast const int const_num = 42; int* non_const_ptr = const_cast<int*>(&const_num); *non_const_ptr = 100; // 修改 const_num (虽然这是未定义行为!) std::cout << const_num << std::endl; // dynamic_cast (需要类有虚函数才能工作) // reinterpret_cast int* int_ptr = new int(65); char* char_ptr = reinterpret_cast<char*>(int_ptr); std::cout << *char_ptr << std::endl; //static_cast float f_num = 3.14f; int i_num = static_cast<int>(f_num); std::cout << i_num << std::endl; return 0; }
-
类和对象相关
class
: 定义类。struct
: 定义结构体 (与class
类似,但默认成员访问权限为public
)。union
: 定义联合体 (所有成员共享同一块内存)。public
: 公有成员访问权限。private
: 私有成员访问权限。protected
: 保护成员访问权限 (对派生类可见)。friend
: 声明友元函数或友元类 (可以访问类的私有成员)。virtual
: 声明虚函数 (实现多态)。inline
: 建议编译器将函数内联展开 (现代编译器通常会自动优化)。template
: 定义模板 (泛型编程)。typename
: 在模板中声明类型参数。operator
: 重载运算符。namespace
: 定义命名空间 (避免命名冲突)。using
: 引入命名空间或类型别名。explicit
: 防止单参数构造函数进行隐式类型转换static_assert
(C++11): 编译时断言constexpr
(C++11): 指定变量或函数可以在编译时求值decltype
(C++11): 推导表达式的类型override
(C++11): 确保派生类函数正确覆盖基类虚函数final
(C++11): 防止类被继承或虚函数被覆盖
#include <iostream> #include <string> // 定义命名空间 namespace MyNamespace { int myVar = 10; void myFunction() { std::cout << "Hello from MyNamespace" << std::endl; } } // 使用命名空间 using namespace MyNamespace; // 定义一个类 class Animal { private: std::string name; // 私有成员 protected: int age; // 保护成员 public: // 构造函数 Animal(const std::string& n, int a) : name(n), age(a) {} // 虚函数 virtual void makeSound() { std::cout << "Generic animal sound" << std::endl; } // 友元函数声明 friend void printAnimalInfo(const Animal& animal); }; // 友元函数定义 (可以访问 Animal 的私有成员) void printAnimalInfo(const Animal& animal) { std::cout << "Name: " << animal.name << ", Age: " << animal.age << std::endl; } // 派生类 class Dog : public Animal { public: // 使用基类的构造函数 Dog(const std::string& n, int a) : Animal(n, a) {} // override 确保函数正确覆盖基类虚函数 void makeSound() override{ std::cout << "Woof!" << std::endl; } }; // 模板函数 template <typename T> T add(T a, T b) { return a + b; } int main() { // 使用命名空间中的变量和函数 std::cout << "myVar: " << myVar << std::endl; // 10 myFunction(); // Hello from MyNamespace // 使用类 Animal animal("Generic", 5); animal.makeSound(); // Generic animal sound printAnimalInfo(animal); Dog dog("Buddy", 3); dog.makeSound(); // Woof! printAnimalInfo(dog); // 使用模板函数 std::cout << add(5, 3) << std::endl; // 8 std::cout << add(3.14, 2.71) << std::endl; // 5.85 }
-
异常处理相关
try
: 包含可能抛出异常的代码块。catch
: 捕获并处理异常。throw
: 抛出异常。
#include <iostream>
#include <stdexcept>
int main() {
try {
int numerator = 10;
int denominator = 0;
if (denominator == 0) {
throw std::runtime_error("Division by zero error!"); // 抛出异常
}
int result = numerator / denominator;
std::cout << "Result: " << result << std::endl;
}
catch (const std::runtime_error& error) { // 捕获 std::runtime_error 类型的异常
std::cerr << "Caught an exception: " << error.what() << std::endl;
}
catch (...) { // 捕获所有类型的异常
std::cerr << "Caught an unknown exception" << std::endl;
}
return 0;
}
- 其他
asm
: 嵌入汇编代码。volatile
: 告诉编译器变量可能会被意外修改(例如,由硬件或其他线程修改)。typedef
: 创建类型别名enum
: 定义枚举类型。
#include <iostream>
// 定义枚举类型
enum Color {
RED,
GREEN,
BLUE
};
int main()
{
// 使用枚举
Color myColor = RED;
if (myColor == RED) {
std::cout << "The color is red" << std::endl;
}
// 使用 typedef
typedef unsigned long long my_ull_t;
my_ull_t bigNumber = 123456789012345;
std::cout << bigNumber << std::endl;
}
表格总结
分类 | 关键字 | 说明 |
---|---|---|
数据类型 | int , float , double , char , bool , void , short , long , signed , unsigned , wchar_t | 定义变量的基本数据类型。void 表示无类型。short , long , signed , unsigned 用于修饰整数类型。wchar_t 用于宽字符。 |
存储类别/生命周期 | auto , static , extern , register , mutable , thread_local | auto 自动类型推断或自动存储类别。static 静态存储。extern 声明外部变量/函数。register 建议寄存器存储 (通常被忽略)。mutable 允许在 const 成员函数中修改。thread_local 表示线程局部存储。 |
控制流 | if , else , switch , case , default , while , do , for , break , continue , goto , return | 控制程序的执行流程。if-else , switch-case-default 用于条件分支。while , do-while , for 用于循环。break 跳出循环/switch 。continue 跳过当前迭代。goto 无条件跳转 (不推荐)。return 从函数返回值。 |
运算符 | sizeof , new , delete , this , typeid ,const_cast ,dynamic_cast , reinterpret_cast , static_cast | sizeof 获取大小。new 动态分配内存。delete 释放内存。this 指向当前对象的指针。 typeid 获取类型信息。const_cast 移除 const 。dynamic_cast 安全类型转换 (运行时检查)。reinterpret_cast 低级类型转换。static_cast 相关类型转换 (编译时检查)。 |
类和对象 | class , struct , union , public , private , protected , friend , virtual , inline , template , typename , operator , namespace , using , explicit , static_assert , constexpr , decltype , override , final | class , struct , union 定义类、结构体、联合体。public , private , protected 成员访问权限。friend 友元。virtual 虚函数 (多态)。inline 内联函数。template 模板。typename 模板类型参数。operator 运算符重载。namespace 命名空间。using 引入命名空间/类型别名。explicit 防止隐式转换。其他 C++11 及以后新增的关键字用于编译时断言、常量表达式、类型推导、虚函数重写检查等。 |
异常处理 | try , catch , throw | try 包含可能抛出异常的代码。catch 捕获并处理异常。throw 抛出异常。 |
其他 | asm , volatile , typedef , enum | asm 嵌入汇编。volatile 防止编译器优化可能被意外修改的变量。typedef 创建类型别名。enum 定义枚举类型。 |
要点补充
- C++11 及以后的关键字: 上面表格中提到了很多 C++11 及以后版本引入的关键字,如
auto
,thread_local
,static_assert
,constexpr
,decltype
,override
,final
等。这些关键字极大地增强了 C++ 的功能和表达力。 - 语境的重要性:一些关键字 (例如
static
) 在不同的上下文中可能有不同的含义。 - 最佳实践: 了解每个关键字的含义和用法,并遵循 C++ 社区的最佳实践,可以帮助你写出更清晰、更健壮、更高效的代码。
- 现代 C++: 随着 C++ 标准的发展, 现代 C++ (C++11/14/17/20/23) 引入了许多新特性和关键字。 强烈建议学习和使用这些新特性,它们能显著提高开发效率和代码质量。
希望这个详细的分类、解释和示例对你有所帮助!