Это кажется очень простым вопросом, но я не смог найти никаких мнений по этому поводу. При написании сеттеров на C++, в чем разница между
void ClassName::set_member( type value ) {
ClassName::member = value;
}
а также
void ClassName::set_member( type value ) {
this->member = value;
}
CLion генерирует первую версию, поэтому я подозреваю, что у нее есть какое-то преимущество, но я не понимаю, в чем оно будет заключаться.
Разве первая версия не устанавливает статический член, а вторая устанавливает член-экземпляр?
@супер, хорошо, я обычно так и делаю. CLion создает методы с тем же именем параметра, что и у класса, поэтому я решил использовать квалификатор.
@fstam Это кажется синтаксически разумным, однако код генерируется для нестатических членов и отлично работает с ними.
Разница чисто синтаксическая. Обе версии имеют одинаковый эффект. Даже не имеет значения, является ли member
статичным или нестатичным. Только внутри статической функции-члена вы не можете использовать версию this->
, потому что нет объекта и, следовательно, нет this
.
Поскольку это кажется действительно странным, стоит повторить: даже если member
является переменной-членом статический, this->member = value;
действителен и делает правильные вещи.
Что касается предпочтения одного стиля другому: как и все стилистические решения, это очень субъективно. Однозначный ответ на самом деле невозможен. Но есть индикаторы того, что предпочитает сообщество C++ в целом. Вы можете посмотреть на:
Принимая во внимание все это, я с уверенностью могу сказать, что преобладающий стиль не является ни одним из двух ваших, но:
member = value;
Чисто личное примечание: для нестатических членов версия ClassName::
кажется незнакомой до такой степени, что я бы назвал ее в обзоре кода. this->
обычно заставляет меня задаться вопросом: «Это написал Java-программист?», но в целом — особенно если он используется постоянно — это нормальный стиль, хотя и необычный; а в некоторых особых случаях метапрограммирования шаблонов это даже обязательно.
Спасибо! Ваш ответ в значительной степени отражает мои подозрения (на самом деле вопрос возник, потому что я сделал вызываю этот синтаксис в обзоре кода! Это университетский проект, и никто из нас не является экспертом).
Я бы выбрал
member = value;
и сэкономил бы время на наборе текста.