Оператор this для чего это , это необходимо?
this это указатель на объект класса. Именно с помощью него можно получать доступ к переменным и методам класса, хотя обычно достаточно к ним можно обращаться без указания this (синтаксический сахар). Однако чтобы вернуть ссылку на текущий объект кроме как обратиться к this способа нет
15 мая 2021 в 15:14
не забудьте поставить галочку!
31 мая 2021 в 18:58
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Как сказали в комментариях, this — указатель на объект класса. Он очень полезен при присваивании значений параметров конструктора полям внутри класса, если поле и параметр имеют одинаковое имя, например:
class MyClass < public: int field; MyClass(int field) < this->field = field; //Присвоили значение параметра полю класса, все ОК field = field; /*Здесь компилятор подумает что вы присваиваете значение параметра самому себе, что приведет к проблемам при обращении к полю класса.*/ > >;
Отслеживать
ответ дан 15 мая 2021 в 15:40
luk_chesnok_xren luk_chesnok_xren
77 1 1 серебряный знак 8 8 бронзовых знаков
this — константный указатель на текущий объект класса. В данном случае писать this не обязательно, так как компилятор сам подставит его. Есть случай когда идентификатор параметра и члена класса одинаковы:
class Class < public: int field; Class(int field) < field = field; >void setNumber(int number) < field = number; >; > obj;
Здесь происходит самоприсваивание, т.к параметр перекрывает видимость члена класса. 2 способа это предовратить: Class::field или this->field .
this передается как невидимый параметр в методы класса. При вызове obj.setNumber(4); C++ понимает, что функция setNumber() работает с объектом obj , а field — это фактически obj.field . Рассмотрим детально, как это всё работает.
Возьмем, к примеру, следующую строку:
obj.setNumber(4);
Хотя на первый взгляд кажется, что у нас здесь только один аргумент, но на самом деле у нас их два! Во время компиляции строка obj.setNumber(4); конвертируется компилятором в следующее:
setNumber(&obj, 4);
Теперь это всего лишь стандартный вызов функции, а объект obj (который ранее был отдельным объектом и находился перед точкой) теперь передается по адресу в качестве аргумента функции.
Но это только половина дела. Поскольку в вызове функции теперь есть два аргумента, то и метод нужно изменить соответствующим образом (чтобы он принимал два аргумента). Следовательно, следующий метод:
void setNumber(int number)
Конвертируется компилятором в:
void setNumber(Class* const this, int number) < this->field = number; >
Также this зачастую возвращают операторы класса, чтобы можно было делать цепочки: obj = obj1 = obj2;
Указатель this C++
Вместо того, чтобы сразу давать определение, что же это такое — указатель this , предлагаю рассмотреть вместе с вами два простейших примера. В одном мы просто определим две функции setData() и getData() . Одна будет предлагать пользователю ввести данные, вторая будет выводить их на экран соответственно. И обратимся к ним из главной функции main() . А во втором примере, мы создадим класс class SetGetData , методы которого так же будут вносить данные и выводить их на экран. Забегая наперед, скажу, что основным отличием этих функций и методов станет то, как они принимают параметры (аргументы).
#include using namespace std; void setData(char *s, int &n) //функция для принятия данных < cout > n; > void getData(char s[], int n) //отображение данных < cout int main() < setlocale(LC_ALL, "rus"); char str[128] = ""; //объявляем и инициализируем переменные для очистки от мусора int number = 0; setData(str, number); //вызов функций system("cls"); //очистка экрана перед выводом данных на экран getData(str, number); return 0; >
Этот пример, скорей всего, не вызвал у вас никаких вопросов и трудностей в его понимании, если уж вы дошли до изучения этой темы. Тут мы определили две функции — строки 5 — 16. Функция setData(char *s, int &n) принимает два параметра: указатель на строку и адрес переменной типа int , для того чтобы внести изменения в переменные, которые ей передадутся при вызове. Функция getData(char s[], int n) отобразит строку и число , измененные пользователем. Далее в main- функции мы просто объявляем переменные и передаем их в наши функции при вызове.
Результатом работы будет, к примеру, такое сообщение:
CppStudio.com
cppstudio.com - site N1
Тут вот какое дело, если мы, при определении функций, не укажем, какие параметры им надо принять либо не передадим переменные в качестве параметров, при вызове функций — это будет крах программы. Компилятор такого нам не простит — в ы это понимаете .
Теперь рассмотрим второй пример (Тут вы уже сразу обратите внимание на то, что мы не передаем параметры в методы ни при определении, ни при вызове методов):
#include using namespace std; class SetGetData //определяем класс < char str[128]; int number; public: void setData() //метод класса, который принимает данные < cout > number; > void getData() //метод класса, который выводит данные на экран < cout >; int main() < setlocale(LC_ALL, "rus"); SetGetData object; //создаем объект класса object.setData(); //вносим данные system("cls"); //очистка экрана перед выводом данных на экран object.getData(); //данные отображаем на экране return 0; >
Вы видите, что явно мы ни при определении, ни при вызове методов через объект, не указываем с какими параметрами будут работать методы класса. Все дело в том, что при вызове методов, которые принадлежат классу, им неявно передается тот самый указатель this . Это происходит автоматически и незаметно для нас, так как он является скрытым первым параметром любого метода-элемента класса. Указатель this указывает на адрес созданного объекта класса — в нашем случае он получает адрес объекта object и указывает методу setData() в какие элементы объекта надо внести измененные данные, а методу getData() — элементы какого объекта надо отобразить на экране.
Важно знать, что у нас есть возможность использовать указатель this явно. Так, к примеру, выглядело бы определение метода getData() , если бы мы использовали this явно:
void getData() //метод класса, который выводит данные на экран < cout str number
Такая запись так же «пройдет»:
void getData() < cout
В обоих случаях можно обойтись без этого явного указания, но как это делается лучше знать по той причине, что указатель this все же используется программистами явно , в определенных случаях. Только это уже совсем другая тема. В данной статье мы лишь проходим по основам.
Теперь можно и определение дать! Указатель this — это указатель на адрес объекта класса, при этом он является скрытым первым параметром любого метода класса (кроме статических методов), а типом указателя выступает имя класса. И еще кое-что из теории:
- this является зарезервированным словом С++;
- мы можем использовать this явно в методах-элементах класса;
- а вот явно объявить, инициализировать либо изменить указатель this , возможности нет;
Так, совсем коротко, мы дали вам основную информацию по этой теме. Остались вопросы? Задавайте их в комментариях к статье. Без ответа мы вас не оставим.
К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!
this (справочник по C#)
Ключевое слово this ссылается на текущий экземпляр класса, а также используется в качестве модификатора первого параметра метода расширения.
В этой статье рассматривается использование this с экземплярами класса. Дополнительные сведения об использовании этого ключевого слова в методах расширения см. в разделе Методы расширения.
Ниже перечислены наиболее частые способы использования this .
-
Для квалификации элементов, скрытых одинаковыми именами, например:
public class Employee < private string alias; private string name; public Employee(string name, string alias) < // Use this to qualify the members of the class // instead of the constructor parameters. this.name = name; this.alias = alias; >>
CalcTax(this);
public int this[int param] < get < return array[param]; >set < array[param] = value; >>
У статических функций-членов нет указателя this , так как они существуют только на уровне класса и не являются частями объектов. Использование this в статическом методе приводит к ошибке.
Пример
В этом примере this используется для квалификации членов класса Employee , name и alias , которые скрыты одинаковыми именами. Это ключевое слово также используется для передачи объекта в метод CalcTax , который принадлежит другому классу.
class Employee < private string name; private string alias; private decimal salary = 3000.00m; // Constructor: public Employee(string name, string alias) < // Use this to qualify the fields, name and alias: this.name = name; this.alias = alias; >// Printing method: public void printEmployee() < Console.WriteLine("Name: \nAlias: ", name, alias); // Passing the object to the CalcTax method by using this: Console.WriteLine("Taxes: ", Tax.CalcTax(this)); > public decimal Salary < get < return salary; >> > class Tax < public static decimal CalcTax(Employee E) < return 0.08m * E.Salary; >> class MainClass < static void Main() < // Create objects: Employee E1 = new Employee("Mingda Pan", "mpan"); // Display results: E1.printEmployee(); >> /* Output: Name: Mingda Pan Alias: mpan Taxes: $240.00 */
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- this Настройки стиля кода (IDE0003 и IDE0009)
- Ключевые слова в C#
- base
- Методы
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Ключевое слово this в C++
Ключевое слово this в языке программирования C++ представляет указатель на текущий объект данного класса. Таким образом, через this мы сможем обратиться внутри класса к любым членам этого класса.
В нашем примере определен класс Point, представляющий точку на плоскости. Для того чтобы хранить координаты этой точки, в классе определены переменные x и y.
Так вот, чтобы обращаться к этим переменным, применяется указатель this. При этом после this надо ставить не точку, а стрелку -> .
Однако в большинстве ситуаций вам вряд ли понадобится ключевое слово this для обращения к членам класса. Зато this может быть необходим в том случае, когда параметры функции либо переменные, определяемые внутри функции, называются точно так же, как и переменные класса. Допустим, this применяют, чтобы разграничить параметры и переменные класса в конструкторе.
Кроме того, используя this, вы сможете возвращать текущий объект класса:
В примере выше метод move возвращает посредством this ссылку на объект текущего класса, выполняя условное перемещение точки. В результате появляется возможность осуществлять вызов метода move по цепочке для одного и того же объекта:
Тут следует отметить, что возвращается не просто объект Point, а ссылка на этот объект. То есть строка, определенная выше, по сути, будет аналогично следующему коду:
Но что было бы, если бы метод move возвращал не ссылку, а просто объект?
В таком случае вызов p1.move(10, 5).move(10) был бы по факту эквивалентен коду ниже:
То есть второй вызов метода move вызывался бы в целях создания временной копии, следовательно, он бы никак не затрагивал переменную p1.