我已经看到建议成员函数使用this->
显式引用成员变量,以避免忘记声明成员变量并意外引用全局变量。如果他们认为这是一种合理的预防措施或不必要的冗长,会不必要地使代码的阅读复杂化,任何人都可以发表评论吗?有没有人在日常现实生活中真正做到这一点?
4 回答
由于我经常实现类模板,因此我习惯于始终使用this->
. 在类模板的上下文中,使用 限定名称是有用的另一个原因this->
: 不依赖于模板参数的名称仅在第一阶段查找中查找,即从不查找依赖于模板参数的基类中的名称在基地。通过限定成员名称与this->
他们成为依赖。例如:
#include <iostream>
void f() { std::cout << "::f()\n"; }
template <typename T>
class base
{
public:
void f() { std::cout << "base::f()\n"; }
};
template <typename T>
class derived
: public base<T>
{
public:
void g() {
f();
this->f();
}
};
int main()
{
derived<int>().g();
}
我在我this->
的所有代码中都使用了限定,除非某些编码指南禁止我这样做(而且我认为编码指南的这一方面是愚蠢和错误的)。当然,在我自己的代码中,我限定了所有可以限定且不是自定义点的名称(例如,我不会限定swap()
)。
好吧,不,因为您通常不会经常使用全局变量,其名称会导致冲突。此外,您始终可以使用前缀来表示成员变量:
class C {
int m_Foo;
int mBar;
};
使用它真的会炸毁代码大小并影响可读性。考虑
class Foo {
int a, b, c, d;
int Bar () {
return (a + b + (b / c) + d * (c + a));
}
};
尝试this->
在上面的示例中添加。
此外,每个优秀的编辑器都会根据变量的范围对变量进行不同的着色。
虽然成员变量的一些约定是一件好事,但我认为this->
它过于冗长,并试图解决一个很少有机会发生的问题。我使用m_var
ormVar
作为成员变量。
它让我想起了这种伪预防措施if (3 == var)
,if (var == 3)
以避免if (var = 3)
. 现在的编译器总是能捕捉到。
可读的代码很重要。它可以防止错误。
this->
通常用于避免与全局变量或成员函数的参数混淆
- 供代码维护者阅读时使用
- 用于 IDE 中的自动完成
m_
您也可以通过使用前缀不那么冗长的成员来获得这些优势