【C++】常用关键字

C++ 关键字分类及详解

C++ 的关键字可以根据其功能大致分为以下几类:

  1. 数据类型相关

    • 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;
    }
    
  2. 存储类别/生命周期相关

    • 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;
    
  3. 控制流相关

    • 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;
    }
    
  4. 运算符相关

    • 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;
    }
    
  5. 类和对象相关

    • 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
    }
    
  6. 异常处理相关

    • 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;
}
  1. 其他
    • 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_localauto 自动类型推断或自动存储类别。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 跳出循环/switchcontinue 跳过当前迭代。goto 无条件跳转 (不推荐)。return 从函数返回值。
运算符sizeof, new, delete, this, typeid,const_cast,dynamic_cast, reinterpret_cast, static_castsizeof 获取大小。new 动态分配内存。delete 释放内存。this 指向当前对象的指针。 typeid 获取类型信息。const_cast 移除 constdynamic_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, finalclass, struct, union 定义类、结构体、联合体。public, private, protected 成员访问权限。friend 友元。virtual 虚函数 (多态)。inline 内联函数。template 模板。typename 模板类型参数。operator 运算符重载。namespace 命名空间。using 引入命名空间/类型别名。explicit 防止隐式转换。其他 C++11 及以后新增的关键字用于编译时断言、常量表达式、类型推导、虚函数重写检查等。
异常处理try, catch, throwtry 包含可能抛出异常的代码。catch 捕获并处理异常。throw 抛出异常。
其他asm, volatile, typedef, enumasm 嵌入汇编。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) 引入了许多新特性和关键字。 强烈建议学习和使用这些新特性,它们能显著提高开发效率和代码质量。

希望这个详细的分类、解释和示例对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值