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;
}
相关推荐
IT_陈寒6 分钟前
Vue3性能优化实战:5个被低估的Composition API技巧让你的应用快30%
前端·人工智能·后端
Moe48814 分钟前
@SpringBootApplication 注解(Spring Boot 自动配置)详解
java·后端
后端小张19 分钟前
【JAVA 进阶】SpringBoot 事务深度解析:从理论到实践的完整指南
java·开发语言·spring boot·后端·spring·spring cloud·事务
间彧20 分钟前
Docker Compose 数据卷挂载详解与项目实战
后端
ChinaRainbowSea32 分钟前
13. Spring AI 的观测性
java·人工智能·后端·spring·flask·ai编程
-大头.34 分钟前
SpringBoot 全面深度解析:从原理到实践,从入门到专家
java·spring boot·后端
charlie1145141911 小时前
使用 Poetry + VS Code 创建你的第一个 Flask 工程
开发语言·笔记·后端·python·学习·flask·教程
aiopencode1 小时前
iOS 上架 App Store 全流程技术解读 应用构建、签名体系与发布通道的标准化方案
后端
Rexi1 小时前
go如何写单元测试2
后端
Rexi1 小时前
go如何写单元测试1
后端