一般来说,这并不重要,因此更简单的选项member = value;
是首选。在某些情况下,局部变量可能存在歧义,您可以使用this->
前缀进行限定,但更好的方法是完全避免歧义。
然而,在某些极端情况下它确实很重要。在处理虚函数时,使用限定名称 ( type::member
)禁用运行时调度并确保type
调用该级别的最终覆盖器:
struct base {
virtual int f() { return 1; }
};
struct derived : base {
virtual int f() { return 2; }
void g() {
std::cout << f() << "\n";
std::cout << derived::f() << "\n";
}
};
struct mostderived : derived {
virtual int f() { return 3; }
};
int main() {
mostderived d;
d.g(); // 3 2
}
在处理模板类和继承时,查找分两个阶段执行。在第一阶段,必须解析非依赖名称。非限定名称是非依赖名称,因此在某些情况下,您需要使用this->
or来限定type::
,并且上述区别仍然适用。额外的资格用于使名称依赖:
template <typename T>
struct derived : T {
void g() {
// std::cout << f() << "\n"; // Error, cannot resolve f() [*]
this->f(); // Ok, pick final overrider at runtime
derived::f(); // Ok, pick overrider here: base::f()
}
};
struct base {
virtual int f() { return 1; }
};
struct mostderived : derived<base> {
virtual int f() { return 3; }
};
int main() {
mostderived d;
d.g(); // 3, 1
}