Подтвердить что ты не робот

Должен ли я использовать `this` внутри класса?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Внутри функции-члена класса в С++ это имеет значение, если я использую 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();
}

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Unless a class member name is hidden, using the class member name is equivalent to using 
the class member name with the this pointer and the class member access operator (->).

Ответ 6

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

Ответ 7

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