This c что это
Перейти к содержимому

This c что это

  • автор:

Оператор 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 мы сможем обратиться внутри класса к любым членам этого класса.

1-1801-30e499.png

В нашем примере определен класс Point, представляющий точку на плоскости. Для того чтобы хранить координаты этой точки, в классе определены переменные x и y.

Так вот, чтобы обращаться к этим переменным, применяется указатель this. При этом после this надо ставить не точку, а стрелку -> .

Однако в большинстве ситуаций вам вряд ли понадобится ключевое слово this для обращения к членам класса. Зато this может быть необходим в том случае, когда параметры функции либо переменные, определяемые внутри функции, называются точно так же, как и переменные класса. Допустим, this применяют, чтобы разграничить параметры и переменные класса в конструкторе.

Кроме того, используя this, вы сможете возвращать текущий объект класса:

2-1801-68c196.png

В примере выше метод move возвращает посредством this ссылку на объект текущего класса, выполняя условное перемещение точки. В результате появляется возможность осуществлять вызов метода move по цепочке для одного и того же объекта:

3-1801-5782c9.png

Тут следует отметить, что возвращается не просто объект Point, а ссылка на этот объект. То есть строка, определенная выше, по сути, будет аналогично следующему коду:

4-1801-fcff77.png

Но что было бы, если бы метод move возвращал не ссылку, а просто объект?

5-1801-584269.png

В таком случае вызов p1.move(10, 5).move(10) был бы по факту эквивалентен коду ниже:

6-1801-d1b08e.png

То есть второй вызов метода move вызывался бы в целях создания временной копии, следовательно, он бы никак не затрагивал переменную p1.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *