указатель "this" внутри класса - PullRequest
6 голосов
/ 23 октября 2009

вопрос прост ... есть ли какая-то разница в использовании this-> yourvariable или yourvariable напрямую по какой-то причине?

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

Я видел комментарий к сообщению здесь, и я не помню, какую ветку, но человек что-то сказал об использовании ключевого слова "this".

Лично я считаю, что лучше использовать эту переменную напрямую. Это делает код более простым и красивым.

Джо

Ответы [ 4 ]

16 голосов
/ 23 октября 2009

В большинстве случаев нет никакой разницы. Но есть ситуации, когда это имеет значение:

class foo
{
    int i;
    void bar() {
        int i = 3;
        i; // refers to local i
        this->i; // refers to the member i
    }
};

Кроме того, для шаблонов вам может понадобиться квалифицировать участника с this->, чтобы поиск имени задерживался:

template<typename T>
struct A
{
    int i;
    T* p;
};

template<typename T>
struct B : A<T>
{
    void foo() {
        int k = this->i; // here this-> is required
    }
};

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

12 голосов
/ 23 октября 2009

Нет, никакой разницы нет, это просто квалификатор области видимости. Однако предположим, что метод

void SetFoo( Foo foo )
{
    this->foo = foo;
}

где this-> foo является приватным участником. Здесь он позволяет вам взять параметр с тем же именем, что и переменная класса / экземпляра.

1 голос
/ 23 октября 2009

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

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

0 голосов
/ 23 октября 2009

Это было своего рода вопрос и ответ о C # здесь , и я думаю, что ответ (по крайней мере мой) тот же. Это предпочтение.

...