Когда я должен явно использовать указатель `this`? - PullRequest
82 голосов
/ 14 июня 2009

Когда я должен явно написать this->member в методе класс?

Ответы [ 12 ]

2 голосов
/ 02 сентября 2015

Основное (или я могу сказать, единственное) назначение указателя this состоит в том, чтобы он указывал на объект, используемый для вызова функции-члена.

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

Например, мы должны вернуть вызывающий объект в функцию-член с аргументом того же класса:

class human {

... 

human & human::compare(human & h){
    if (condition)
        return h;       // argument object
    else 
        return *this;   // invoking object
    }
};
2 голосов
/ 14 июня 2009

Я обнаружил еще один интересный случай явного использования указателя "this" в книге Effective C ++.

Например, скажем, у вас есть функция const, как

  unsigned String::length() const

Вы не хотите вычислять длину строки для каждого вызова, поэтому вы хотите кэшировать ее, делая что-то вроде

  unsigned String::length() const
  {
    if(!lengthInitialized)
    {
      length = strlen(data);
      lengthInitialized = 1;
    }
  }

Но это не скомпилируется - вы меняете объект в const-функции.

Хитрость для решения этой проблемы требует приведения this к неконстантному this :

  String* const nonConstThis = (String* const) this;

Тогда вы сможете сделать выше

  nonConstThis->lengthInitialized = 1;
...