Предпочтение стиля в установщиках: Class::member = value или this->member = value?

Это кажется очень простым вопросом, но я не смог найти никаких мнений по этому поводу. При написании сеттеров на C++, в чем разница между

void ClassName::set_member( type value ) {
    ClassName::member = value;
}

а также

void ClassName::set_member( type value ) {
    this->member = value;
}

CLion генерирует первую версию, поэтому я подозреваю, что у нее есть какое-то преимущество, но я не понимаю, в чем оно будет заключаться.

Я бы выбрал member = value; и сэкономил бы время на наборе текста.

super 30.05.2019 09:13

Разве первая версия не устанавливает статический член, а вторая устанавливает член-экземпляр?

fstam 30.05.2019 09:13

@супер, хорошо, я обычно так и делаю. CLion создает методы с тем же именем параметра, что и у класса, поэтому я решил использовать квалификатор.

Kjeld Schmidt 30.05.2019 09:21

@fstam Это кажется синтаксически разумным, однако код генерируется для нестатических членов и отлично работает с ними.

Kjeld Schmidt 30.05.2019 09:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разница чисто синтаксическая. Обе версии имеют одинаковый эффект. Даже не имеет значения, является ли member статичным или нестатичным. Только внутри статической функции-члена вы не можете использовать версию this->, потому что нет объекта и, следовательно, нет this.

Поскольку это кажется действительно странным, стоит повторить: даже если member является переменной-членом статический, this->member = value; действителен и делает правильные вещи.

Что касается предпочтения одного стиля другому: как и все стилистические решения, это очень субъективно. Однозначный ответ на самом деле невозможен. Но есть индикаторы того, что предпочитает сообщество C++ в целом. Вы можете посмотреть на:

  • код C++ с открытым исходным кодом на GitHub и т. д. или реализация вашей стандартной библиотеки
  • фрагменты кода на слайдах презентаций крупных конференций, таких как CppCon, Meeting C++, C++ Now и т. д.
  • основные книги по C++, например. Серия Язык программирования С++ Страустроупа или серия Эффективный С++ Скотта Мейерса

Принимая во внимание все это, я с уверенностью могу сказать, что преобладающий стиль не является ни одним из двух ваших, но:

member = value;

Чисто личное примечание: для нестатических членов версия ClassName:: кажется незнакомой до такой степени, что я бы назвал ее в обзоре кода. this-> обычно заставляет меня задаться вопросом: «Это написал Java-программист?», но в целом — особенно если он используется постоянно — это нормальный стиль, хотя и необычный; а в некоторых особых случаях метапрограммирования шаблонов это даже обязательно.

Спасибо! Ваш ответ в значительной степени отражает мои подозрения (на самом деле вопрос возник, потому что я сделал вызываю этот синтаксис в обзоре кода! Это университетский проект, и никто из нас не является экспертом).

Kjeld Schmidt 30.05.2019 10:20

Другие вопросы по теме