Разница между 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(); // или .... дальшейний код... } Хотелось бы конечно почитать более подробно, в каких случаях и зачем надо или нужно использовать один из вариантов))
(*this).vecStudents.size(); - в данном случае this указывает на текущий объект типа Student. При использовании (*this) мы разыменовываем указатель this и обращаемся к полю vecStudents этого объекта.
this -> vecStudents.size(); - это эквивалентная запись предыдущему варианту, но с использованием оператора ->, который позволяет обращаться к полям объекта указателем на него, не разыменовывая его явно.
Student::vecStudents.size(); - здесь Student:: указывает на статическое поле класса Student. То есть, при использовании этой конструкции, мы обращаемся к статическому полю vecStudents, а не к полю объекта.
vecStudents.size(); - в данном случае мы обращаемся к полю vecStudents, но при этом не указываем явно, к какому объекту оно относится. Если vecStudents является статическим полем класса, то этот вариант точно не будет работать. Если же vecStudents является полем объекта, то компилятор будет искать это поле у текущего объекта, на котором вызвана функция functionName.
Таким образом, выбор между этими вариантами зависит от того, к какому полю вы хотите обратиться (у текущего объекта, у статического поля класса или у другого объекта), и какой способ обращения вам более удобен в данной ситуации.
(*this).vecStudents.size(); - в данном случае this указывает на текущий объект типа Student. При использовании (*this) мы разыменовываем указатель this и обращаемся к полю vecStudents этого объекта.
this -> vecStudents.size(); - это эквивалентная запись предыдущему варианту, но с использованием оператора ->, который позволяет обращаться к полям объекта указателем на него, не разыменовывая его явно.
Student::vecStudents.size(); - здесь Student:: указывает на статическое поле класса Student. То есть, при использовании этой конструкции, мы обращаемся к статическому полю vecStudents, а не к полю объекта.
vecStudents.size(); - в данном случае мы обращаемся к полю vecStudents, но при этом не указываем явно, к какому объекту оно относится. Если vecStudents является статическим полем класса, то этот вариант точно не будет работать. Если же vecStudents является полем объекта, то компилятор будет искать это поле у текущего объекта, на котором вызвана функция functionName.
Таким образом, выбор между этими вариантами зависит от того, к какому полю вы хотите обратиться (у текущего объекта, у статического поля класса или у другого объекта), и какой способ обращения вам более удобен в данной ситуации.