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;
}
相关推荐
cyforkk2 小时前
Spring Boot @RestController 注解详解
java·spring boot·后端
canonical_entropy3 小时前
可逆计算:一场软件构造的世界观革命
后端·aigc·ai编程
重庆穿山甲3 小时前
从0到1:用 Akka 持久化 Actor + Outbox + RocketMQ 做到“订单-库存最终一致”
后端
我不只是切图仔5 小时前
我只是想给网站加个注册验证码,咋就那么难!
前端·后端
专注VB编程开发20年5 小时前
CSS 的命名方式像是 PowerShell 的动词-名词结构,缺乏面向对象的层级关系
开发语言·后端·rust
野犬寒鸦5 小时前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode
爱吃烤鸡翅的酸菜鱼5 小时前
【Spring】原理:Bean的作用域与生命周期
后端·spring
JohnYan5 小时前
工作笔记 - 微信消息发送和处理
javascript·后端·微信