Правильное использование этого-> - PullRequest
4 голосов
/ 28 ноября 2011

Как правильно использовать this ссылку на класс?

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

void function() {
  while(i != this->length) //length is member var
     /*do something*/
}

Другой способ его использования, с которым я часто сталкиваюсь, - внутри конструкторов (в основном в Java), так как параметры имеют то же имя, что и переменные-члены, которые должны быть инициализированы.Поскольку Primer утверждает, что это плохой код, я не делаю этого, но, с другой стороны, я вижу, как использовать то же имя, что и для членов-членов, поскольку имена параметров очищают от того, какое использование они используют.

C++
Constructor::Constructor(int size,int value) : this->size(size),
                                               this->value(value) {};

Java
Constructor(int size,int value) {
  this->size = size;
  this->value = value;
}

Надеюсь, что на самом деле существует правило, учитывающее оба языка (Java / c ++), если нет, я сделаю метку только для c ++, так как это тот, который меня больше интересует.

Ответы [ 6 ]

10 голосов
/ 28 ноября 2011

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

2 голосов
/ 28 ноября 2011

this здесь не требуется, поскольку в списках инициализации могут быть только члены:

Constructor::Constructor(int size,int value) : size(size), // no need for this->
                                           value(value) {};

Единственное другое использование this-> - в шаблонах.

template <class T>
struct foo : T {
  void bar() {
    this->x = 5; // T has a member named x
  }
};

Если вам не нужно его использовать, тогда не надо.Избегайте использования параметров функции с тем же именем, что и члены, для вещей, отличных от конструкторов и методов установки.

1 голос
/ 28 ноября 2011

Использование this в конструкторе не обязательно: компиляторы достаточно умны, чтобы отличать имена параметров от имен членов. Фрагмент ниже компилируется и работает просто отлично:

Constructor::Constructor(int size,int value) : size(size), value(value) {};

В общем, использование this для устранения неоднозначности допустимо, но не обязательно: как вы правильно заметили, вы можете просто использовать разные имена для параметров и элементов, и все. Однако бывают случаи, когда вы должны использовать this, иначе ничего не скомпилируется. Вот несколько надуманный пример - использование this для установки «обратной ссылки» следующим образом:

class Callback {
    Client *client;
public:
    Callback(Client* client) : client(client) {}
    // ...
}

class Client {
    Callback callback;
public:
    Client() : callback(this) {} // You must use 'this' here
    // ...
}
1 голос
/ 28 ноября 2011

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

1 голос
/ 28 ноября 2011

с использованием this-> явно заявляет, что вы ссылаетесь на метод / переменную-член. Комментируя, сказать, что это просто избыточно ... если только по какой-то причине у вас нет локальной переменной AND переменная-член, которая имеет то же имя и по-разному манипулирует ими в одном и том же блоке кода, например ::

int x = 7;
this->x = 8; // yes, I really mean the member variable here
0 голосов
/ 28 ноября 2011

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

...