我应该在课堂上使用`this`吗?

时间:2012-03-06 19:52:18

标签: c++ class this

在C ++类的成员函数中,如果我使用this->dataMember或只是dataMember,它会有所作为吗?什么被认为是更好的风格?有没有性能差异?

(我不是在讨论局部变量与数据成员同名的情况,在这种情况下,据我所知,您必须使用this->来区分它们。)

7 个答案:

答案 0 :(得分:28)

作为一般规则,这是地方惯例的问题。大部分的 我见过的地方除非必要,否则不会使用this-> 我也喜欢这个惯例,但我听说过喜欢的人 系统地使用它。

有必要时有两种情况。首先是你隐藏了 本地范围内具有相同名称的名称;如果是你有一个成员 命名为toto,您还将函数参数命名为toto。许多 编码约定标记成员或argments以避免这种情况 案例,例如所有成员名称均以mym_或参数名称开头 将以the开头。

另一种情况是this->可以在模板中用来制作名称 依赖。如果模板类继承自a,则这是相关的 依赖类型,并且您想要访问基类的成员,例如:

template <typename T>
class Toto : public T
{
public:
    int f()
    {
        return this->g();
    }
};

如果没有this->g()将是一个非依赖名称,而且。{ 编译器会在模板定义的上下文中查找它, 没有考虑基类。

答案 1 :(得分:7)

这是一种风格问题。有些人喜欢额外的this->,以便更明显地说你正在访问一个班级成员。但是如果你觉得没有它就足够明显,生成的代码或性能就没有区别了。

(除了您提到的重叠范围的情况之外,在尝试命名依赖于类型的基类的成员时,this->在模板中也是必需的。)

答案 2 :(得分:5)

使用this->来调用成员是多余的,除非您希望在语义上快速区分本地成员和成员。 很多人使用m_前缀作为班级成员,以避免一直写this->

答案 3 :(得分:5)

在调用成员函数时,我总是使用this

  1. 它将函数名称转换为依赖名称,以便在类模板中找到基类成员函数。
  2. 它抑制了依赖于参数的查找。 ADL有它的优点,但它可以导致令人惊讶的行为,如果它不妨碍我,我喜欢它。
  3. 它没有真正的缺点,因此出于一致性原因我将其用于所有成员函数调用。
  4. 我在Python中编程很多,明确的self是强制性的,所以这对我来说不是真正的负担。
  5. 但对于数据成员,我只在必要时才使用它,因为没有ADL发生。回答您的具体问题:

      

    在C ++类的成员函数中,如果我使用this-&gt; dataMember或只是dataMember,它会有所作为吗?

    是的,如果这是在类模板中。然后dataMember被视为非依赖名称,这可能导致语义差异。例如:

    #include <iostream>
    
    int i = 1;
    
    struct R {
      int i;
      R(): i(2) { }
    };
    
    template<typename T>
    struct S: T {
      void f() {
        std::cout << i << ' '     // selects ::i
                  << this->i      // selects R::i
                  << std::endl;
      }
    };
    
    int main() {
      S<R>().f();
    }
    
      

    什么被认为是更好的风格?

    我不认为社区内有这方面的强烈意见。使用任何一种风格,但要保持一致。

      

    有任何性能差异吗?

    我很确定没有。

答案 4 :(得分:1)

当你有一个隐藏/私有成员=)时使用它,在任何其他情况下它没有区别=)

来自IBM信息中心,我引用以下内容

  

除非隐藏类成员名称,否则使用类成员名称   相当于使用带有this指针的类成员名称   类成员访问运算符( - &gt;)。

答案 5 :(得分:0)

使用“this-&gt;”更好(你确定它是成员),但它没有什么区别

答案 6 :(得分:0)

如果模板函数调用成员函数,使得调用不依赖于任何模板参数,this->可用于帮助编译器替代MyUtopicClass<int, double, double>::vin()