Должен ли я использовать `this` в классе? - PullRequest
19 голосов
/ 06 марта 2012

В пределах функции-члена класса в C ++, имеет ли значение, если я использую this->dataMember или просто dataMember?Что считается лучшим стилем?Есть ли разница в производительности?

(я не говорю о случае, когда локальная переменная имеет то же имя, что и элемент данных, и в этом случае, насколько мне известно, вы должны использовать this->, чтобы различатьих.)

Ответы [ 7 ]

29 голосов
/ 07 марта 2012

Как правило, это вопрос местных соглашений.В большинстве мест, которые я видел, не используется this->, кроме случаев, когда это необходимо, и это соглашение, которое я предпочитаю, но я слышал о людях, которые предпочитают использовать его систематически.

Есть дваслучаи, когда это необходимо.Во-первых, если вы скрыли имя с тем же именем в локальной области видимости;например, если у вас есть член с именем toto, и вы также назвали аргумент своей функции toto.Многие соглашения о кодировании помечают либо элемент, либо его аргументы, чтобы избежать этого случая, например, все имена элементов начинаются с my или m_, или имя параметра начинается с the.

Другой случай состоит в том, чтоthis-> можно использовать в шаблоне, чтобы сделать имя зависимым.Это актуально, если шаблонный класс наследует от зависимого типа, и вы хотите получить доступ к члену базы, например:

template <typename T>
class Toto : public T
{
public:
    int f()
    {
        return this->g();
    }
};

Без this-> здесь g() будет независимое имя, и компилятор будет искать его в контексте определения шаблона, не принимая во внимание базовый класс.

7 голосов
/ 07 марта 2012

Это вопрос стиля.Некоторым людям нравится дополнительная this->, чтобы сделать более очевидным, что вы обращаетесь к ученику.Но если вы чувствуете, что это достаточно очевидно без этого, не будет никакой разницы в сгенерированном коде или производительности.

(Кроме случая, который вы упомянули с перекрывающимися областями, this-> также может быть обязательным в шаблоне при попыткеназвать члена зависимого от типа базового класса.)

5 голосов
/ 07 марта 2012

Я всегда использую this при вызове члена функции .

  1. Превращает имя функции в зависимое имя, чтобы функции-члены базового класса находились в шаблоне класса.
  2. Подавляет зависимый от аргумента поиск.У ADL есть свои преимущества, но это может привести к удивительному поведению, и мне нравится, если оно не мешает мне.
  3. У него нет реальных недостатков, и поэтому я использую его для всех вызовов функций-членов из соображений согласованности..
  4. Я много программирую на Python, где явный self обязателен, поэтому для меня это не реальное бремя.

Но для членов данных я использую его только при необходимостипотому что не происходит ADL.Чтобы ответить на ваши конкретные вопросы:

В рамках функции-члена класса в C ++, имеет ли значение, если я использую this-> dataMember или просто dataMember?

Да, если это в шаблоне класса.Тогда dataMember считается независимым именем, что может привести к семантическим различиям.Например:

#include <iostream>

int i = 1;

struct R {
  int i;
  R(): i(2) { }
};

template<typename T>
struct S: T {
  void f() {
    std::cout << i << ' '     // selects ::i
              << this->i      // selects R::i
              << std::endl;
  }
};

int main() {
  S<R>().f();
}

Что считается лучшим стилем?

Я не думаю, что в сообществе существует твердое мнение по этому поводу.Используйте любой стиль, но будьте последовательны.

Есть ли разница в производительности?

Я почти уверен, что нет.

5 голосов
/ 06 марта 2012

просто избыточно использовать this-> для вызова участников, если вы не хотите быстро семантически различать местных жителей и участников.многие используют префикс m_ для учеников, чтобы не писать постоянно this->.

1 голос
/ 06 марта 2012

используйте это, когда у вас есть скрытый / закрытый член =) в любом другом случае это не имеет значения =)

из информационного центра IBM, я цитирую следующее

Если имя члена класса скрыто, использование имени члена класса эквивалентно использованию имени члена класса с указателем this и оператором доступа к члену класса (->).

0 голосов
/ 07 марта 2012

Если функция шаблона выполняет вызов функции-члена так, что вызов не зависит от каких-либо параметров шаблона, this-> может использоваться для помощи компилятору в качестве альтернативы MyUtopicClass<int, double, double>::vin().

0 голосов
/ 06 марта 2012

лучше использовать "this->" (вы уверены, что это члены), но это не имеет значения

...