2.2this指针

1.4k words

2-2this指针


“this指针”通俗版解释


1. 为什么需要this指针?

想象你有一个班级,每个学生(对象)都有自己的姓名和成绩(数据),但全班共用同一本教材(成员函数)。

  • 老师提问时,教材里的答案要对应到具体学生。比如问“你的成绩是多少?”,教材需要知道当前问的是哪个学生
  • this指针就像老师手里的名单,告诉教材:“现在操作的是张三,下一个是李四”。

代码例子

1
2
3
4
5
6
7
8
9
10
11
12
class Student {
private:
int score;
public:
void setScore(int s) {
score = s; // 这里的score属于当前调用setScore的对象
}
};

Student zhangsan, lisi;
zhangsan.setScore(90); // this指向zhangsan
lisi.setScore(85); // this指向lisi

2. this指针是什么?

  • 隐藏的指针:每个成员函数(非静态)都有一个隐藏参数this,指向调用该函数的对象。
  • 自动传递:当你调用a.g(1)时,编译器偷偷把&a传给this,函数内部通过this->x访问a.x

编译器视角

1
2
3
4
5
// 你写的代码:
void setScore(int s) { score = s; }

// 编译器实际处理:
void setScore(Student *this, int s) { this->score = s; }

3. 什么时候需要显式用this?

  • 场景1:返回对象自己

    比如实现链式调用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Counter {
    int count = 0;
    public:
    Counter& add() {
    count++;
    return *this; // 返回当前对象,支持连续调用
    }
    };

    Counter c;
    c.add().add().add(); // 连续加3次
  • 场景2:区分同名变量

    当成员变量和参数同名时:

    1
    2
    3
    4
    5
    6
    7
    class Dog {
    string name;
    public:
    void setName(string name) {
    this->name = name; // this->name是成员变量,name是参数
    }
    };

4. 用C语言模拟this指针

C语言没有类,但可以用结构体和函数模拟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// C++的类:
class Dog {
public:
void bark() { cout << "汪汪!"; }
};

// 对应的C代码:
struct Dog { /* 数据成员 */ };
void bark(struct Dog *this) {
printf("汪汪!");
}

// 使用:
struct Dog d;
bark(&d); // 相当于d.bark()

5. 总结

  • this指针的作用:告诉成员函数“当前操作的是哪个对象”。
  • 自动传递:你不需要手动写this,编译器帮你加。
  • 显式使用场景返回对象、区分同名变量、传递对象自身

比喻

  • 类成员函数像一份公共菜谱,this指针像厨师手里的食材,告诉菜谱:“现在炒的是这盘菜”。
  • 没有this,所有对象的数据会乱成一锅粥!
Comments