对象指针与 this 指针

上节课的最后,我们提到:

静态成员函数没有 this 指针。

什么是 this 指针呢?在 C++ 中,this 是一个指向当前对象的指针,也就是对象指针。因此,在学习 this 指针之前,我们还需要先来了解一下对象指针。

对象指针

顾名思义,对象指针就是指向对象的指针。这个对象存储空间的首地址就是对象指针的值(关于指针的概念可以学习 C 语言指针)。

对象指针的声明形式如下:

类名 * 对象指针名

例如:

#include <iostream>
using namespace std;


// 定义 Person 类
class Person {
private:
    int _age;
public:
    void set_age(int age) {
        _age = age;
    }

    int get_age() {
        return _age;
    }
};

int main() {
    Person obj_1;           // 定义一个 Person 对象

    Person* ptr_1;          // 定义一个 Person 指针

    ptr_1 = &obj_1;         // 将 obj_1 对象的地址传递给 ptr_1

    return 0;
}

如果想要通过对象指针来访问对象中的成员可以采用以下两种方式:

  1. 对指针进行解引用操作:

    (*ptr_1).set_age(18);
    cout << "年龄:" << (*ptr_1).get_age() << endl;
    

    需要注意的是,解引用运算符 * 的优先级低于 .,因此,为了提高 * 的优先级,需要把 *ptr_1 放在小括号中。

  2. 使用箭头运算符:

    // 通过箭头运算符访问对象成员
    ptr_1->set_age(20);
    cout << "修改后的年龄:" << ptr_1->get_age() << endl;

this 指针

在 C++ 中, this 是每一个非静态成员函数的一个形参,它指向调用该成员函数的对象。

不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器将它添加到参数列表中。

this 指针最常见的用途是解决成员变量与函数参数同名的问题,此外它还可以用于在成员函数中返回对象本身。例如:

// 定义 Person 类
class Person {
private:
    int age;

public:
    void set_age(int age) {
        this->age = age;
    }
    int get_age() {
        return age;
    }

};

在上面的代码中,当函数的参数 age 与类的成员变量 age 同名时,我们使用 this->age 来明确表示成员变量。