← Назад к вопросам

Что такое this?

1.3 Junior🔥 141 комментариев
#Язык C++

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое this в C++?

Определение

this — это скрытый указатель, который существует в контексте каждого non-static метода класса. Он указывает на объект, для которого был вызван метод.

class Person {
public:
    void greet() {
        // this — это указатель на текущий объект Person
        std::cout << "Привет, я " << this->name << std::endl;
    }

private:
    std::string name;
};

Что такое this на самом деле?

this — это:

  • Указатель: Person* this (в примере выше)
  • Неявно передаваемый параметр каждому методу
  • Const-указатель: нельзя изменить, чтобы указывал на другой объект
  • Неявный: не видно в списке параметров

Внутренне, вызов метода:

person.greet();  // Компилятор преобразует это в:
Person::greet(&person);  // передает адрес объекта как скрытый параметр

Использование this

1. Явный доступ к членам

class Rectangle {
private:
    double width;
    double height;

public:
    void setDimensions(double width, double height) {
        // Без this было бы неясно, какой width имеется в виду
        this->width = width;    // член класса
        this->height = height;  // член класса
    }
};

2. Возврат ссылки на текущий объект (для цепочек вызовов)

class Builder {
private:
    std::string value;

public:
    Builder& append(const std::string& str) {
        value += str;
        return *this;  // возвращаем ссылку на себя
    }
    
    Builder& toUpper() {
        std::transform(value.begin(), value.end(), value.begin(), ::toupper);
        return *this;
    }
    
    std::string build() { return value; }
};

// Использование цепочки
std::string result = Builder()
    .append("hello")
    .append(" ")
    .append("world")
    .toUpper()
    .build();
// result = "HELLO WORLD"

3. Сравнение объектов с самими собой

class Vector {
private:
    std::vector<int> data;

public:
    Vector& operator=(const Vector& other) {
        if (this == &other) {  // проверка самоприсваивания
            return *this;
        }
        data = other.data;
        return *this;
    }
};

Vector v;
v = v;  // Безопасно благодаря проверке this == &other

4. Передача указателя на себя другим функциям

class Observer {
public:
    void subscribe(Observable& observable) {
        observable.addListener(this);  // передаем адрес текущего объекта
    }
};

Тип this

В обычном методе:

class MyClass {
public:
    void method() {
        // this имеет тип: MyClass*
        MyClass* ptr = this;
    }
};

В const методе:

class MyClass {
public:
    void method() const {
        // this имеет тип: const MyClass*
        // Нельзя изменять члены класса
        // this->member = 5;  // ОШИБКА!
    }
};

В volatile методе (редко):

class MyClass {
public:
    void method() volatile {
        // this имеет тип: volatile MyClass*
    }
};

this в конструкторе и деструкторе

class Node {
private:
    Node* parent;
    std::vector<Node*> children;

public:
    Node(Node* p = nullptr) : parent(p) {
        if (parent) {
            parent->children.push_back(this);  // регистрируем себя в родителе
        }
    }
    
    ~Node() {
        if (parent) {
            // удаляем себя из родителя
            auto& siblings = parent->children;
            siblings.erase(std::remove(siblings.begin(), siblings.end(), this), siblings.end());
        }
    }
};

this в шаблонных методах

template<typename T>
class Container {
public:
    T& get() {
        return this->data;  // явно указываем, что ищем member в текущем объекте
    }
    
    T data;
};

Практический пример: паттерн Builder

class QueryBuilder {
private:
    std::string query;
    
public:
    QueryBuilder& select(const std::string& columns) {
        query += "SELECT " + columns + " ";
        return *this;  // ключевая роль this!
    }
    
    QueryBuilder& from(const std::string& table) {
        query += "FROM " + table + " ";
        return *this;
    }
    
    QueryBuilder& where(const std::string& condition) {
        query += "WHERE " + condition;
        return *this;
    }
    
    std::string build() const { return query; }
};

// Использование
auto sql = QueryBuilder()
    .select("id, name")
    .from("users")
    .where("age > 18")
    .build();
// sql = "SELECT id, name FROM users WHERE age > 18"

Важные моменты

  • this не может быть изменен: this = nullptr; — синтаксическая ошибка
  • В static методах this не существует — это обычные функции
  • this всегда не-нулевой указатель в нормальных условиях
  • Производительность: использование this имеет нулевую стоимость во время выполнения
  • В const методе: this -> const-указатель, предотвращает модификацию членов

Заключение

this — это одна из фундаментальных концепций ООП в C++. Она позволяет:

  • Методам знать, какой объект их вызвал
  • Возвращать ссылку на текущий объект для цепочек вызовов
  • Передавать адрес текущего объекта другим функциям
  • Проверять самоприсваивание
  • Реализовать паттерны проектирования (Builder, Observer и др.)