• C++最佳实践之常用关键字


    C++的常用关键字包括:auto、decltype、bool/false/true、throw、try、catch、class、consteval、constexpr、constinit、new、delete、const_cast、static_cast、dynamic_cast
    、reinterpret_cast、explicit、export、friend、mutable、using、namespace、noexcept、
    nullptr、operator、private、protected、public、static_assert、template、typename、this、thread_local、typeid、virtual等。我们结合代码示例来介绍各个关键字。

    目录

    1、auto自动推断变量

    2、decltype推断变量类型

    3、bool布尔变量

    4、throw/try/catch异常处理

    5、class类与对象

    6、constexpr常量表达式

    7、new与delete管理对象

    8、类型转换

    9、explicit显式调用

    10、export全局引用

    11、friend友元函数

    12、mutable可变变量

    13、namespace命名空间

    14、noexcept禁止异常

    15、nullptr空指针

    16、private、protected和public


    1、auto自动推断变量

    auto根据变量初始化来推断变量类型。示例如下:

    auto array = new int[8];

    2、decltype推断变量类型

    与auto不同的是,decltype是根据表达式来推断变量类型。语法格式如下:

    decltype(expression) var;

    表达式包括:变量、运算、函数等,示例如下:

    1. long add() {
    2. return 0;
    3. }
    4. void hello() {
    5. int a = 2;
    6. decltype(a) b; // b为int类型
    7. decltype(add()) c; // c为long类型
    8. }

    3、bool布尔变量

    bool关键字表示布尔变量,只有true或false两种变量值。

    4、throw/try/catch异常处理

    使用关键字throw抛出异常,使用try/catch来捕获异常。示例代码如下:

    1. try {
    2. std::string msg("This is a test exception");
    3. throw msg;
    4. } catch (const std::string &e) {
    5. printf("exception=%s", e.c_str());
    6. }

    5、class类与对象

    C++的类与java类相似,都是面向对象编程。类的声明示例如下:

    1. #include <string>
    2. class Person {
    3. private:
    4. int m_age;
    5. std::string m_name;
    6. public:
    7. void setAge(int age);
    8. int getAge();
    9. void setName(const std::string &name);
    10. std::string getName();
    11. };

    对应的类实现如下:

    1. #include "Person.h"
    2. void Person::setAge(int age) {
    3. m_age = age;
    4. }
    5. int Person::getAge() {
    6. return m_age;
    7. }
    8. void Person::setName(const std::string &name) {
    9. m_name = name;
    10. }
    11. std::string Person::getName() {
    12. return m_name;
    13. }

    创建Person类的对象实例:

    1. auto person = new Person();
    2. person->setAge(10);
    3. person->setName("frank");
    4. printf("name=%s, age=%d", person->getName().c_str(), person->getAge());

    6、constexpr常量表达式

    constexpr只能修饰带有return的函数。在C++20增加了consteval修饰常量表达式,不同的是,在编译期确定参数类型。示例如下:

    1. constexpr int hello(int a, int b) {
    2. return a + b;
    3. }

    另外,函数体内不能有赋值运算,否则有如下报错:

    subexpression not valid in a constant expression

    7、new与delete管理对象

    在C++提供关键字new来创建对象,delete释放对象。在C语言是用库函数malloc来申请内存,free来释放内存。要注意的是,释放数组需要加上[]。示例如下:

    1. // 创建对象
    2. auto person = new Person();
    3. // 释放对象
    4. delete person;
    5. // 创建数组
    6. auto array = new int[8];
    7. // 释放数组
    8. delete[] array;

    8、类型转换

    C++提供const_cast、static_cast、dynamic_cast和reinterpret_cast四种类型转换,如下表所示:

    const_cast用于修改const属性,接受指针或引用类型
    static_cast用于基本类型转换
    dynamic_cast用于有继承关系的类指针转换,支持类型检查
    reinterpret_cast用于指针类型转换

    类型转换的示例代码如下:

    1. // const_cast用于const属性
    2. const int a = 10;
    3. int &b = const_cast<int &> (a);
    4. // static_cast基本类型转换
    5. float x = 10.5f;
    6. int y = static_cast<int> (x);
    7. // dynamic_cast用于子类与父类转换
    8. SuperMan *superman = new SuperMan();
    9. superman->setAge(100);
    10. Person *person = dynamic_cast<Person*> (superman);
    11. // reinterpret_cast用于指针类型转换
    12. void *data = (void *) "hello";
    13. char *new_data = reinterpret_cast<char *> (data);

    9、explicit显式调用

    explicit用于修饰单参数的构造函数,被修饰的构造函数只能被显式调用,不能被隐式调用。示例如下:

    1. class Person {
    2. private:
    3. int m_age;
    4. public:
    5. explicit Person(int age);
    6. };

    10、export全局引用

    C语言有extern关键字用于声明全局变量,但是C++的模板没法用extern修饰。因此,提供export修饰在头文件声明的模板类或模板函数,其他源文件只要引用该头文件即可使用模板类或模板函数。

    11、friend友元函数

    friend关键字把函数声明为友元函数。声明函数为外部类的友元函数后,外部类可以通过友元函数访问该类的私有成员。示例代码如下:

    1. class Pointer;
    2. class Calculator {
    3. public:
    4. Pointer* add(Pointer &a, Pointer &b);
    5. };
    6. class Pointer {
    7. // 声明为Calculator的友元函数
    8. friend Pointer* Calculator::add(Pointer &a, Pointer &b);
    9. private:
    10. int m_x;
    11. int m_y;
    12. public:
    13. Pointer(int x, int y);
    14. };
    15. // Calculator访问Pointer的私有成员,通过对象访问
    16. Pointer* Calculator::add(Pointer &a, Pointer &b) {
    17. return new Pointer(a.m_x + b.m_x, a.m_y + b.m_y);
    18. }

    12、mutable可变变量

    mutable用于且只能修饰类的成员变量,与const修饰常量相反。比如,constexpr修饰的常量表达式不允许修改成员变量,而成员变量添加mutable修饰符后可修改。示例如下:

    1. class Person {
    2. private:
    3. mutable int m_age;
    4. public:
    5. explicit Person(int age);
    6. constexpr int getAge();
    7. };
    8. constexpr int Person::getAge() {
    9. m_age += 10; // 修改成员变量
    10. return m_age;
    11. }

    非成员变量使用mutable修饰符会报错如下:

    'mutable' can only be applied to member variable

    13、namespace命名空间

    命名空间用于模块隔离,避免模块之间命名冲突。示例代码如下:

    1. namespace Learning {
    2. class Person {
    3. private:
    4. std::string m_name;
    5. public:
    6. void setName(const std::string &name);
    7. std::string getName();
    8. };
    9. }

    使用using引用命名空间,需要注意的是遵循最小原则。示例如下:

    1. // 直接命名空间引用
    2. Learning::Person *person1 = new Learning::Person();
    3. // 引入命名空间
    4. using namespace Learning;
    5. Person *person2 = new Person();

    14、noexcept禁止异常

    使用noexcept修饰函数禁止抛出异常,防止错误扩散。示例如下:

    std::string getName() noexcept;

    15、nullptr空指针

    在C语言使用NULL表示空指针,java使用null表示空指针,Object-C使用nil表示空指针。当然,今天的主角是C++,它使用nullptr表示空指针。

    16、private、protected和public

    与java类似,C++提供private、protected和public访问修饰符,可以修饰类、函数、变量。三者对比如下:

    private类内部访问
    proteted有继承关系的类可访问
    public类外部都可以访问

  • 相关阅读:
    数据-OLTP、OLAP
    Java——list的四种遍历
    实际项目中事务管理_体会
    春招苦短,我用百道Python面试题备战
    全日制和非全日制之争,看完六年前的这个文件心里就有数了
    Object.preventExtensions vs Object.seal vs Object.freeze
    Java中方法的定义及注意事项
    《MLB棒球创造营》:走近棒球运动·多伦多蓝鸟队
    Java实现魔板拼图小游戏(完整版)
    【Android】android studio 怎么下载NDK
  • 原文地址:https://blog.csdn.net/u011686167/article/details/125514140