The previous (accepted) answer is incorrect!
The main reason of using this
to access the members of the class is when this class is a template, and the base class depends of the template parameter. Consider this code:
struct Base {
Base ()
: m_baseMember(42) {}
int m_baseMember;
};
int m_baseMember;
struct Derived : public Base {
Derived() {
m_baseMember = 0;
m_derivedMember = 0;
}
int m_derivedMember;
};
int main() {
Derived d;
cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
return 0;
}
This code obviously outputs 0 0
, as the assignment m_baseMember = 0;
affects the member of the Base
class.
Now a very similar code, but the base class becomes a template, and I instantiate it with int
:
template<typename T>
struct Base {
Base ()
: m_baseMember(42) {}
int m_baseMember;
};
int m_baseMember;
struct Derived : public Base<int> {
Derived() {
m_baseMember = 0;
m_derivedMember = 0;
}
int m_derivedMember;
};
int main() {
Derived d;
cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
return 0;
}
Again the output is 0 0
. Ok, let's move on. Both Base
and Derived
are templates...
template<typename T>
struct Base {
Base ()
: m_baseMember(42) {}
int m_baseMember;
};
int m_baseMember;
template<typename T>
struct Derived : public Base<int> {
Derived() {
m_baseMember = 0;
m_derivedMember = 0;
}
int m_derivedMember;
};
int main() {
Derived<int> d;
cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
return 0;
}
The output is 0 0
again. Nothing could go wrong with this code! One more attempt: now the Derived
inherits from Base<T>
(and not from Base<int>
):
template<typename T>
struct Base {
Base ()
: m_baseMember(42) {}
int m_baseMember;
};
int m_baseMember;
template<typename T>
struct Derived : public Base<T> {
Derived() {
m_baseMember = 0;
m_derivedMember = 0;
}
int m_derivedMember;
};
int main() {
Derived<int> d;
cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
return 0;
}
And the output is... 42 0
.
That is because in this very-very-very similar code the assignment m_baseMember = 0;
is being applied to the global variable. The final snippet where we explicitly use this
:
template<typename T>
struct Base {
Base ()
: m_baseMember(42) {}
int m_baseMember;
};
int m_baseMember;
template<typename T>
struct Derived : public Base<T> {
Derived() {
this->m_baseMember = 0;
m_derivedMember = 0;
}
int m_derivedMember;
};
int main() {
Derived<int> d;
cout << d.m_baseMember << ' ' << d.m_derivedMember << endl;
return 0;
}
The output is 0 0
again, because this->m_baseMember = 0;
obviously affects the class member.