Последнее обновление:2026-10-12
C++ указатель this¶
Об авторе¶
Официальный аккаунт в 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; после запуска получим следующее:


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

Обнаружим, что компилятор превращает 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 станет указателем на структуру.
Похожие темы¶
- C++ чисто виртуальные функции и абстрактные классы | C++那些事
- C++ утверждения assert | C++那些事
- C++ битовые поля | C++那些事
- Реализация полиморфизма C++ на языке C | C++那些事
- C++ константы const и его модификация | C++那些事
- C++ всё семейство const | C++那些事
- C++ оператор разыменования * | C++那些事
- C++ инициализация и присваивание | C++那些事
- C++ возврат нескольких значений | C++那些事
- C++ ключевое слово mutable | C++那些事