Normalmente, você não precisa, this->está implícito.
Às vezes, há uma ambigüidade de nome, onde pode ser usado para desambiguar membros de classe e variáveis locais. No entanto, aqui está um caso completamente diferente em que this->é explicitamente necessário.
Considere o seguinte código:
template<class T>struct A {int i;};template<class T>struct B : A<T>{int foo(){returnthis->i;}};int main(){
B<int> b;
b.foo();}
Se omitir this->, o compilador não saberá como tratar i, pois pode ou não existir em todas as instanciações de A. Para dizer que ié de fato um membro de A<T>, para qualquer T, o this->prefixo é necessário.
Nota: ainda é possível omitir o this->prefixo usando:
template<class T>struct B : A<T>{using A<T>::i;// explicitly refer to a variable in the base classint foo(){return i;// i is now known to exist}};
Se você declarar uma variável local em um método com o mesmo nome de um membro existente, você terá que usar this-> var para acessar o membro da classe em vez da variável local.
#include<iostream>usingnamespace std;class A
{public:int a;void f(){
a =4;int a =5;
cout << a << endl;
cout <<this->a << endl;}};int main(){
A a;
a.f();}
Em seu último caso, observe que você pode chamar uma constfunção não membro em um temporário ( Type(rhs).swap(*this);é legal e correto), mas um temporário não pode vincular a um parâmetro de referência não const (o compilador rejeita swap(Type(rhs));também this->swap(Type(rhs));)
Ben Voigt
5
Existem alguns casos em que o uso thisdeve ser usado e há outros em que usar o thisponteiro é uma maneira de resolver um problema.
1) Alternativas disponíveis : Para resolver a ambigüidade entre as variáveis locais e os membros da classe, conforme ilustrado por @ASk .
2) Sem alternativa: Para retornar um ponteiro ou referência thisde uma função de membro. Isso é feito com freqüência (e deve ser feito) quando a sobrecarga operator+, operator-, operator=, etc:
Alguns consideram isso consistente, outros consideram uma abominação. Conte comigo no último grupo.
3) Sem alternativa: para resolver nomes em tipos dependentes. Isso surge ao usar modelos, como neste exemplo:
#include<iostream>template<typenameVal>classValHolder{private:Val mVal;public:ValHolder(constVal& val):
mVal (val){}Val&GetVal(){return mVal;}};template<typenameVal>classValProcessor:publicValHolder<Val>{public:ValProcessor(constVal& val):ValHolder<Val>(val){}ValComputeValue(){// int ret = 2 * GetVal(); // ERROR: No member 'GetVal'int ret =4*this->GetVal();// OK -- this tells compiler to examine dependant type (ValHolder)return ret;}};int main(){ValProcessor<int> proc (42);constint val = proc.ComputeValue();
std::cout << val <<"\n";}
4) Alternativas disponíveis: Como parte do estilo de codificação, para documentar quais variáveis são variáveis de membro em oposição a variáveis locais. Eu prefiro um esquema de nomenclatura diferente, onde os membros varibales nunca podem ter o mesmo nome dos locais. Atualmente estou usando mNamepara membros ename locais.
Você só precisa usar this-> se tiver um símbolo com o mesmo nome em dois namespaces potenciais. Considere por exemplo:
class A {public:void setMyVar(int);void doStuff();private:int myVar;}void A::setMyVar(int myVar){this->myVar = myVar;// <- Interesting point in the code}void A::doStuff(){int myVar =::calculateSomething();this->myVar = myVar;// <- Interesting point in the code}
Nos pontos interessantes do código, referir-se a myVar se referirá ao local (parâmetro ou variável) myVar. Para acessar o membro da classe também chamado myVar, você precisa usar explicitamente "this->".
Esse é o único uso de this->que é trivial evitar (basta dar um nome diferente à variável local). Todos os usos realmente interessantes de thisnem mesmo são mencionados por esta resposta.
cmaster - restabelecer monica
4
Os outros usos para isso (como eu pensei quando li o resumo e metade da pergunta ...), desconsiderando a desambiguação de nomenclatura (ruim) em outras respostas, são se você deseja lançar o objeto atual, vinculá-lo a um objeto de função ou use-o com um ponteiro para membro.
Casts
voidFoo::bar(){
misc_nonconst_stuff();constFoo* const_this =this;
const_this->bar();// calls const versiondynamic_cast<Bar*>(this)->bar();// calls specific virtual function in case of multi-inheritance}voidFoo::bar()const{}
Não, você não precisa disso, você pode usar . Você também pode usar um nome diferente para o argumento da função, que tem a vantagem de não ter duas entidades com o mesmo nome.
cmaster - restabelecer monica
3
O principal (ou posso dizer, o único) objetivo do thisponteiro é apontar para o objeto usado para invocar uma função de membro.
Com base neste propósito, podemos ter alguns casos em que apenas o uso de thisponteiro pode resolver o problema.
Por exemplo, temos que retornar o objeto de chamada em uma função-membro com argumento é um mesmo objeto de classe:
class human {...
human & human::compare(human & h){if(condition)return h;// argument objectelsereturn*this;// invoking object}};
Ou você pode torná-lo lengthmutável ou até mesmo colocá-lo em uma estrutura aninhada. Jogar fora a constância quase nunca é uma boa ideia.
Richard J. Ross III
3
Por favor, não. Se o membro tiver que ser mudado de constfunções de membro, deve ser mutable. Caso contrário, você estará tornando a vida mais complicada para você e outros mantenedores.
research.att.com/~bs/
agorastroustrup.com
. Novo link: stroustrup.com/bs_faq2.html#thisRespostas:
Normalmente, você não precisa,
this->
está implícito.Às vezes, há uma ambigüidade de nome, onde pode ser usado para desambiguar membros de classe e variáveis locais. No entanto, aqui está um caso completamente diferente em que
this->
é explicitamente necessário.Considere o seguinte código:
Se omitir
this->
, o compilador não saberá como tratari
, pois pode ou não existir em todas as instanciações deA
. Para dizer quei
é de fato um membro deA<T>
, para qualquerT
, othis->
prefixo é necessário.Nota: ainda é possível omitir o
this->
prefixo usando:fonte
i
que não existe emA
. Posso obter um exemplo?template<> struct A<float> { float x; };
Se você declarar uma variável local em um método com o mesmo nome de um membro existente, você terá que usar this-> var para acessar o membro da classe em vez da variável local.
estampas:
5
4
fonte
Existem vários motivos pelos quais você pode precisar usar o
this
ponteiro explicitamente.fonte
Embora eu geralmente não goste, tenho visto outras pessoas usarem isso-> simplesmente para obter ajuda do intellisense!
fonte
Alguns padrões de codificação usam a abordagem (2), pois afirmam que torna o código mais fácil de ler.
Exemplo:
suponha que MyClass tenha uma variável de membro chamada 'count'
fonte
Um outro caso é ao invocar operadores. Por exemplo, em vez de
Você pode dizer
O que pode ser mais legível. Outro exemplo é o copiar e trocar:
Não sei por que não está escrito,
swap(temp)
mas parece ser comum.fonte
const
função não membro em um temporário (Type(rhs).swap(*this);
é legal e correto), mas um temporário não pode vincular a um parâmetro de referência não const (o compilador rejeitaswap(Type(rhs));
tambémthis->swap(Type(rhs));
)Existem alguns casos em que o uso
this
deve ser usado e há outros em que usar othis
ponteiro é uma maneira de resolver um problema.1) Alternativas disponíveis : Para resolver a ambigüidade entre as variáveis locais e os membros da classe, conforme ilustrado por @ASk .
2) Sem alternativa: Para retornar um ponteiro ou referência
this
de uma função de membro. Isso é feito com freqüência (e deve ser feito) quando a sobrecargaoperator+
,operator-
,operator=
, etc:Isso permite um idioma conhecido como " encadeamento de método ", onde você executa várias operações em um objeto em uma linha de código. Tal como:
Alguns consideram isso consistente, outros consideram uma abominação. Conte comigo no último grupo.
3) Sem alternativa: para resolver nomes em tipos dependentes. Isso surge ao usar modelos, como neste exemplo:
4) Alternativas disponíveis: Como parte do estilo de codificação, para documentar quais variáveis são variáveis de membro em oposição a variáveis locais. Eu prefiro um esquema de nomenclatura diferente, onde os membros varibales nunca podem ter o mesmo nome dos locais. Atualmente estou usando
mName
para membros ename
locais.fonte
Você só precisa usar this-> se tiver um símbolo com o mesmo nome em dois namespaces potenciais. Considere por exemplo:
Nos pontos interessantes do código, referir-se a myVar se referirá ao local (parâmetro ou variável) myVar. Para acessar o membro da classe também chamado myVar, você precisa usar explicitamente "this->".
fonte
this->
que é trivial evitar (basta dar um nome diferente à variável local). Todos os usos realmente interessantes dethis
nem mesmo são mencionados por esta resposta.Os outros usos para isso (como eu pensei quando li o resumo e metade da pergunta ...), desconsiderando a desambiguação de nomenclatura (ruim) em outras respostas, são se você deseja lançar o objeto atual, vinculá-lo a um objeto de função ou use-o com um ponteiro para membro.
Casts
Obrigatório
ptr-to-member
Espero que ajude a mostrar outros usos disso além de apenas este-> membro.
fonte
Você precisa usar
this
para desambiguar entre parâmetros / variáveis locais e variáveis de membro.fonte
O principal (ou posso dizer, o único) objetivo do
this
ponteiro é apontar para o objeto usado para invocar uma função de membro.Com base neste propósito, podemos ter alguns casos em que apenas o uso de
this
ponteiro pode resolver o problema.Por exemplo, temos que retornar o objeto de chamada em uma função-membro com argumento é um mesmo objeto de classe:
fonte
Eu encontrei outro caso interessante de uso explícito do ponteiro "this" no livro Effective C ++.
Por exemplo, digamos que você tenha uma função const como
Você não quer calcular o comprimento da String para cada chamada, portanto, você deseja armazená-la em cache fazendo algo como
Mas isso não vai compilar - você está mudando o objeto em uma função const.
O truque para resolver isso requer lançando este a um não-const esta :
Então, você será capaz de fazer acima
fonte
length
mutável ou até mesmo colocá-lo em uma estrutura aninhada. Jogar fora a constância quase nunca é uma boa ideia.const
funções de membro, deve sermutable
. Caso contrário, você estará tornando a vida mais complicada para você e outros mantenedores.