C++——类和对象

隐藏的 this 指针 4

  1. 什么是 this 指针?
    • 每个非静态成员函数都有一个指向调用该函数的对象的指针,这个指针被称为 this 指针。
    • this 指针是一个隐含的参数,它被编译器自动传递给成员函数。
  2. this 指针的类型
    • this 指针的类型是指向当前对象的指针,例如,对于类 MyClassthis 指针的类型为 MyClass* const
  3. 何时使用 this 指针
    • 当需要在成员函数中引用当前对象时,可以使用 this 指针。
    • 当需要区分成员变量和局部变量同名的情况时,可以使用 this 指针。
  4. 显式使用 this 指针
    • 通常情况下,可以省略 this 指针,编译器会自动识别。
    • 在一些情况下,为了代码清晰或者避免歧义,可以显式地使用 this 指针。
  5. 示例代码
c++ 复制代码
class MyClass {
public:
    int value;

    void setValue(int value) {
        this->value = value; // 使用 this 指针区分成员变量和参数
    }

    void printValue() {
        cout << "value: " << this->value << endl; // 使用 this 指针访问成员变量
    }
};

静态成员

  1. 什么是静态成员?
    • 静态成员是属于类本身的成员,而不是属于某个对象的成员。
    • 静态成员变量和静态成员函数都属于静态成员。
  2. 静态成员变量
    • 声明方式:在成员变量声明前加上 static 关键字。
    • 内存分配:静态成员变量在程序开始时分配内存,在程序结束时释放内存。
    • 初始化:必须在类定义外部进行初始化。
    • 访问方式:可以通过类名和作用域解析符 :: 访问,也可以通过对象访问。
  3. 静态成员函数
    • 声明方式:在成员函数声明前加上 static 关键字。
    • 特点:
      • 没有 this 指针,因此无法访问非静态成员变量或调用非静态成员函数。
      • 可以访问静态成员变量和调用静态成员函数。
    • 访问方式:可以通过类名和作用域解析符 :: 访问。
  4. 示例代码
c++ 复制代码
class MyClass {
public:
    static int count; // 声明静态成员变量

    static void printCount() { // 声明静态成员函数
        cout << "Count: " << count << endl;
    }
};

int MyClass::count = 0; // 在类定义外部初始化静态成员变量

int main() {
    MyClass::count = 10; // 通过类名访问静态成员变量
    MyClass::printCount(); // 通过类名访问静态成员函数

    MyClass obj;
    obj.count = 20; // 通过对象访问静态成员变量
    obj.printCount(); // 通过对象访问静态成员函数

    return 0;
}

常量成员

  1. 什么是常量成员?
    • 常量成员是指在声明时使用 const 关键字修饰的成员变量或成员函数。
    • 常量成员的值在初始化后不能被修改。
  2. 常量成员变量
    • 声明方式:在成员变量声明前加上 const 关键字。
    • 初始化:只能在构造函数初始化列表中进行初始化。
  3. 常量成员函数
    • 声明方式:在成员函数声明后加上 const 关键字。
    • 特点:
      • 不能修改任何成员变量的值。
      • 不能调用非 const 成员函数。
      • this 指针是指向常量的指针,即 const MyClass* const
  4. 示例代码
c++ 复制代码
class MyClass {
public:
    const int value; // 声明常量成员变量

    // 构造函数初始化列表中初始化常量成员变量
    MyClass(int val) : value(val) {}

    int getValue() const { // 声明常量成员函数 const MyClass* const
        return value;
    }
};

int main() {
    MyClass obj(10);
    // obj.value = 20; // 错误:不能修改常量成员变量的值

    cout << "Value: " << obj.getValue() << endl;

    return 0;
}
相关推荐
杨DaB14 分钟前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
why技术26 分钟前
也是震惊到我了!家里有密码锁的注意了,这真不是 BUG,是 feature。
后端·面试
桦说编程34 分钟前
方法一定要有返回值 \ o /
java·后端·函数式编程
David爱编程1 小时前
Java 创建线程的4种姿势,哪种才是企业级项目的最佳实践?
java·后端
Java微观世界2 小时前
Object核心类深度剖析
java·后端
MrSYJ2 小时前
为什么HttpSecurity会初始化创建两次
java·后端·程序员
bcbnb3 小时前
移动端webview网页调试实战,首屏加载缓慢问题的排查与优化
后端
00后程序员3 小时前
Charles抓包工具全面解析 API调试与网络分析的必备利器
后端
AAA修煤气灶刘哥3 小时前
Java+AI 驱动的体检报告智能解析:从 PDF 提取到数据落地全指南
java·人工智能·后端