在成员函数中显式“this->”

时间:2012-12-02 22:30:52

标签: c++

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

4 个答案:

答案 0 :(得分:7)

由于我经常实现类模板,因此我习惯于使用this->限定成员变量和成员函数。在类模板的上下文中,为什么使用this->限定名称是有用的另一个原因:不依赖于模板参数的名称仅在阶段I查找中查找,即基类中的名称取决于模板参数永远不会在基础中查找。通过使用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())。

答案 1 :(得分: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->

此外,每个好的编辑器都会根据其范围以不同的方式为变量着色。

答案 2 :(得分:1)

虽然成员变量的某些约定是一件好事,但我认为this->过于冗长,并试图解决一个难得的机会。我使用m_varmVar作为成员变量。

它让我想起了if (3 == var) {199}的伪预防措施,以避免if (var == 3)的错误。现在编译器总是会抓住它。

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

答案 3 :(得分:1)

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

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

您也可以通过为m_成员添加前缀来获得这些优势 前缀不那么详细