Разница между this ->, (*this), className::, и «ничего» перед аттрибутами в ООП c++? Представим, что у меня класс под именем Student. В header фаиле идет декларация вектора vecStudents. В cpp фаиле идут функции такого рода. В функции ниже я привел 4 различных примера.
Дак вот профессора смутило, что я везде писал Student::vecStudents.size(); или просто vecStudents.size(); после чего привел еще 2 других примера, но так и не смог обьяснить мне различия в каждом из вариантов(не говорю уже о "подобробном разьяснении") :) Поэтому вот в безысходности обращаюсь сюда с таким вопросом...void Student::functionName(param) {
int size = (*this).vecStudents.size(); // или
int size = this -> vecStudents.size(); // или
int size = Student::vecStudents.size(); // или
int size = vecStudents.size(); // или
.... дальшейний код...
}
Хотелось бы конечно почитать более подробно, в каких случаях и зачем надо или нужно использовать один из вариантов))

21 Авг 2019 в 07:05
280 +1
0
Ответы
1

(*this).vecStudents.size(); - в данном случае this указывает на текущий объект типа Student. При использовании (*this) мы разыменовываем указатель this и обращаемся к полю vecStudents этого объекта.

this -> vecStudents.size(); - это эквивалентная запись предыдущему варианту, но с использованием оператора ->, который позволяет обращаться к полям объекта указателем на него, не разыменовывая его явно.

Student::vecStudents.size(); - здесь Student:: указывает на статическое поле класса Student. То есть, при использовании этой конструкции, мы обращаемся к статическому полю vecStudents, а не к полю объекта.

vecStudents.size(); - в данном случае мы обращаемся к полю vecStudents, но при этом не указываем явно, к какому объекту оно относится. Если vecStudents является статическим полем класса, то этот вариант точно не будет работать. Если же vecStudents является полем объекта, то компилятор будет искать это поле у текущего объекта, на котором вызвана функция functionName.

Таким образом, выбор между этими вариантами зависит от того, к какому полю вы хотите обратиться (у текущего объекта, у статического поля класса или у другого объекта), и какой способ обращения вам более удобен в данной ситуации.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир