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;
}
相关推荐
长栎6 分钟前
你的 AI 品控规则越来越多了——但它们已经在打架了,你没看见
后端
有脚就行10 分钟前
第24篇-Go-gRPC推理服务-高性能跨语言通信
开发语言·人工智能·后端·golang
不好听61313 分钟前
NestJS 是什么?一张图看懂企业级后端的骨架
后端·nestjs
liuxiaocheng15 分钟前
文本生成的进阶:generateText / streamText 里迟早会撞上的东西
前端·后端·ai编程
江小渔26 分钟前
训练工程与训练平台入门33 追踪一次 TrainJob 的完整生命周期
后端
无糖可可果30 分钟前
NestJS 学习分享:从工厂模式到企业级后端开发
后端
vipbic1 小时前
网站升级了,我却有点舍不得
前端·vue.js·后端
IT_陈寒1 小时前
Java Stream并行处理让我数据库崩了两次
前端·人工智能·后端
2601_963870221 小时前
【计算机毕业设计】基于Spring Boot的考研信息交流平台的设计与实现
java·spring boot·后端
大模型丫丫1 小时前
Spring Boot 入门指南:从零开始构建你的第一个应用
java·spring boot·后端