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.