Должен ли я использовать `this` внутри класса?
Внутри функции-члена класса в С++ это имеет значение, если я использую this->dataMember
или просто dataMember
? Что считается лучшим стилем? Есть ли разница в производительности?
(Я не говорю о том, что локальная переменная имеет то же имя, что и элемент данных, и в этом случае, насколько мне известно, используйте this->
, чтобы различать их.)
Ответы
Ответ 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()
.