Указатель 'this'
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 7 из 104.
В C++ this — это указатель на текущий объект. Используйте this-> для доступа к членам, особенно когда имена параметров совпадают с именами членов.
Без this параметр скрывает поле класса
void Player::setName(std::string name) {
name = name; // Присваивает параметр самому себе! Поле класса не изменяется.
}Использование this-> для правильного присваивания значений
void Player::setName(std::string name) {
this->name = name; // Присваивает параметр члену класса
}Использование this-> в методах
std::string Player::getStatus() {
return this->name + " - Score: " + std::to_string(this->score);
}Указатель this всегда указывает на текущий экземпляр объекта. В отличие от Java и C#, где this является ссылкой, в C++ это указатель, поэтому для доступа к членам вы используете -> вместо ..
Задание
СреднеРеализуйте методы класса Player, используя this->, чтобы различать члены класса и параметры с одинаковыми именами:
- Методы-сеттеры: используйте
this->для присвоения значений параметров членам класса getStatus(): используйтеthis->для доступа к членам класса, возвращайте"<name> - Score: <score>, Level: <level>"
Шпаргалка
В C++, this — это указатель на текущий объект. Используйте this-> для доступа к членам, особенно когда имена параметров совпадают с именами членов.
Без this параметр перекрывает член класса:
void Player::setName(std::string name) {
name = name; // Assigns parameter to itself! Member unchanged.
}Использование this-> для правильного присваивания значений:
void Player::setName(std::string name) {
this->name = name; // Assigns parameter to member
}Использование this-> в методах:
std::string Player::getStatus() {
return this->name + " - Score: " + std::to_string(this->score);
}Указатель this всегда указывает на текущий экземпляр объекта. В отличие от Java и C#, где this является ссылкой, в C++ это указатель, поэтому для доступа к членам вы используете -> вместо ..
Попробуйте сами
#include <iostream>
#include "Player.h"
int main() {
std::string name;
int score, level;
std::getline(std::cin, name);
std::cin >> score >> level;
Player player;
player.setName(name);
player.setScore(score);
player.setLevel(level);
std::cout << "Name: " << player.name << std::endl;
std::cout << "Score: " << player.score << std::endl;
std::cout << "Level: " << player.level << std::endl;
std::cout << player.getStatus() << std::endl;
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнер