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;
}
相关推荐
Bs_MoneyMagnet12 分钟前
基于springboot+vue的茶铺管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
她说..16 分钟前
RabbitMQ 使用场景详解
java·spring boot·后端·spring·rabbitmq·java-rabbitmq
shengjk136 分钟前
AI会让程序员失业吗?200年前的手工织工已经给出了答案
后端
盖伦发发1 小时前
MySQL InnoDB事务完整教程|ACID、MVCC、隔离级别、事务控制
经验分享·后端·spring·软件工程
一条泥憨鱼1 小时前
苍穹外卖【day09| 对订单的各种操作】
后端·苍穹外卖
前端snow1 小时前
ai agent --- AGUI 协议,流式渲染组件
人工智能·后端
用户8181870627461 小时前
第26章 Kafka vs RocketMQ vs RabbitMQ真实选型对比
java·后端
小兔崽子去哪了2 小时前
深度学习 2 / CNN 神经网络
后端·python
rannn_1112 小时前
【Java面试八股】Java基础篇|数据类型、面向对象、关键字、反射、注解、异常、新特性、序列化、设计模式、IO
java·后端·面试
用户8356290780512 小时前
Python 实现 Word 文档域的插入与管理
后端·python