Перейти к содержанию

Последнее обновление:2026-10-12

C++ указатель this

Об авторе

Официальный аккаунт в WeChat:

wechat

1.Указатель this

Полагаю, многие из присутствующих изучают Python; в Python есть self, а аналог в C++ — это указатель this; давайте же вместе глубоко разберём использование указателя this в классах!

Сначала поговорим о назначении указателя this:

(1)Указатель this объекта не является частью самого объекта и не влияет на результат sizeof(объект).

(2)Область действия this — внутри класса: когда в нестатической членской функции класса происходит обращение к нестатическим членам класса, компилятор автоматически передаёт функции адрес самого объекта как неявный параметр. Иначе говоря, даже если вы не написали указатель this, компилятор при компиляции всё равно добавит его; он является неявным формальным параметром нестатической членской функции, и доступ ко всем членам осуществляется через this.

Далее — использование указателя this:

(1)Когда нестатическая членская функция класса возвращает сам объект класса, просто используйте return *this.

(2)Когда имя параметра совпадает с именем переменной-члена, например this->n = n (нельзя писать n = n).

Кроме того, в интернете можно встретить утверждения, что this разбирается компилятором как A *const или A const * — что же из этого верно? Разберём это с помощью отладки по точкам останова:

Пусть есть следующий пример:

#include<iostream>
#include<cstring>


using namespace std;
class Person{
public:
    typedef enum {
        BOY = 0, 
        GIRL 
    }SexType;
    Person(char *n, int a,SexType s){
        name=new char[strlen(n)+1];
        strcpy(name,n);
        age=a;
        sex=s;
    }
    int get_age() const{

        return this->age; 
    }
    Person& add_age(int a){
        age+=a;
        return *this; 
    }
    ~Person(){
        delete [] name;
    }
private:
    char * name;
    int age;
    SexType sex;
};


int main(){
    Person p("zhangsan",20,Person::BOY); 
    cout<<p.get_age()<<endl;
    cout<<p.add_age(10).get_age()<<endl;
    return 0;
}

Думаю, с этой простой программой проблем ни у кого не возникнет: определяется класс, инициализируется конструктор, затем запрашивается возраст человека, после установки — снова запрашивается!

Чтобы проверить, каким именно является указатель this, поставим точку останова в add_age; после запуска получим следующее:

thiscontrust

genthis

Обнаружим, что компилятор автоматически добавляет нам A* const, а не A const *this!

Далее, в приведённом выше коде есть ещё и константная функция; поставим точку останова в get_age, как показано ниже:

constthis

Обнаружим, что компилятор превращает this выше в const A* const; это легко объяснить: поскольку функция является const-функцией, она может обращаться только к const-переменным и const-функциям и не может изменять значения других переменных; поэтому нужен this, указывающий на неизменяемые переменные, то есть const A*; а поскольку сам this — const-указатель, в итоге получаем const A* const!

Резюме: this конструируется перед началом выполнения членской функции и уничтожается после её завершения. Функция get_age выше будет разобрана как get_age(const A * const this), а функция add_age — как add_age(A* const this,int a). В C++ между классом и структурой есть лишь одно различие: члены класса по умолчанию private, а структуры — public. this — это указатель класса; если заменить класс структурой, то this станет указателем на структуру.

Похожие темы

Комментарии