2009-10-22 4 views
6

вопрос прост ... есть ли какая-либо разница в использовании этого-> yourvariable или yourvariable по какой-то причине?«этот» указатель внутри класса

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

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

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

Джо

+2

см. Http://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-the-this-pointer –

+0

Большинство рекомендаций по кодированию, которые я прочитал, нахмурились, делая это без уважительной причины , Это кодовый шум, который не добавляет никакого смысла. Любой, кто читает ваш код, должен иметь возможность вывести из контекста, в котором используется член класса. – dss539

+0

Использование 'this' явно делает программу более читаемой – Xinus

ответ

12

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

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

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

0

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

1

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

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

16

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

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->» сообщает, что он является членом базового класса. Поскольку базовый класс зависит от параметра шаблона, поиск задерживается до тех пор, пока не будет создан экземпляр класса.

+0

+1 для сигнализации проблемы с шаблоном. gcc обычно говорит что-то по строке «» не зависит от параметра шаблона, поэтому должно быть доступно определение ». –

Смежные вопросы