2

我已经看到建议成员函数使用this->显式引用成员变量,以避免忘记声明成员变量并意外引用全局变量。如果他们认为这是一种合理的预防措施或不必要的冗长,会不必要地使代码的阅读复杂化,任何人都可以发表评论吗?有没有人在日常现实生活中真正做到这一点?

4

4 回答 4

8

由于我经常实现类模板,因此我习惯于始终使用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())。

于 2012-12-02T22:41:25.887 回答
1

好吧,不,因为您通常不会经常使用全局变量,其名称会导致冲突。此外,您始终可以使用前缀来表示成员变量:

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->在上面的示例中添加。

此外,每个优秀的编辑器都会根据变量的范围对变量进行不同的着色。

于 2012-12-02T22:34:37.307 回答
1

虽然成员变量的一些约定是一件好事,但我认为this->它过于冗长,并试图解决一个很少有机会发生的问题。我使用m_varormVar作为成员变量。

它让我想起了这种伪预防措施if (3 == var)if (var == 3)以避免if (var = 3). 现在的编译器总是能捕捉到。

可读的代码很重要。它可以防止错误。

于 2012-12-02T22:35:50.817 回答
1

this->通常用于避免与全局变量或成员函数的参数混淆

  • 供代码维护者阅读时使用
  • 用于 IDE 中的自动完成

m_
您也可以通过使用前缀不那么冗长的成员来获得这些优势

于 2012-12-02T22:47:15.237 回答