跳至主要內容

this指针

AkashiNeko原创C++this

隐藏参数

为了能修改对象的内存空间,在每个非静态成员函数的参数中,都隐藏了一个 this 指针,该指针指向调用函数的对象。

class A {
    int num;
public:
    void setNum(int n) {
        num = n;
    }
};

A a;
a.setNum(10); // 函数调用,修改对象内存中的变量

之所以 setNum 函数能够修改对象的成员变量 num,是因为 setNum 函数的参数列表中,有一个隐藏的参数 this,函数其实是通过 this 指针找到对象所在的内存空间,并对内容进行修改。

// 编译器眼中的成员函数
class A {
    ...
    void setNum(A* const this, int n) {
        this->num = n;
    }
    ...
};

this指针

在C++中,this指针是一个隐式的指针,它指向当前对象的地址。通过使用this指针,可以在类的成员函数内部访问和操作当前对象的成员变量和成员函数。它主要用于解决成员变量与形参重名的冲突,同时也可以在成员函数中返回当前对象的引用,以实现链式调用。

const修饰

如果程序员声明了一个 const 对象,那么对象的内存应该无法被修改。即 this 指针需要被 const 修饰,才能保证成员函数无法修改对象的内存空间。

const A* const this

但是在成员函数中,this 指针是一个隐藏参数,程序员无法直接使用 const 来修饰它。因此,C++给出的解决方案是:在函数声明的末尾加上 const 关键字,用以修饰 this 指针。

class A {
    int num;
public:
    void setNum(int n) {
        num = n;
    }
    int getNum() const { // const 用于修饰 this 指针
        // this->num = 10; // 无法修改
        return num;
    }
};

...

A a1;
a1.setNum(10);

const A a2;
a2.getNum();
// a2.setNum(10); // 不能通过编译

空指针this

this 为空指针时,只要不对它进行解引用,程序仍能正常运行。这种做法是不推荐的。

class A {
public:
    void print() {
        cout << "qwq\n";
    }
private:
    int a_;
};

int main() {
    A* pa = nullptr; // 空指针的对象
    pa->print(); // 将自身指针传入函数
    return 0;
}

this作返回值

this 指针也可以作为函数的返回值使用,返回对象指针或者对象本身。

class A {
public:
    void init(int a = 0) {
        a_ = a;
    }
    A& add() {
        ++a_;
        return *this;
    }
    void print() {
        cout << a_ << endl;
    }
private:
    int a_;
};

int main() {
    A a;
    a.init(0);
    a.add().add();
    return 0;
}