应该这个 - >在C ++中调用内部类成员的情况下使用operator?

时间:2014-09-16 06:36:23

标签: c++

我的问题是关于C ++中的这个运算符,我们应该尽可能多地使用它吗?我给出了以下示例来说明我的观点:

class Abc

{
public:
  int a_;
  void fun();

};

void Abc::fun()
{
  // option 1
   a_ = 3;
  // option 2
  this->a_ = 3;
}

在函数类成员fun()中,我们可以用两种方式调用成员变量,一种是使用this->而另一种是不使用它。所以我的问题是:鼓励哪种做法?谢谢。

3 个答案:

答案 0 :(得分:4)

如果变量和参数的名称相同,则必须使用this

class Foo
{
public:
    int _a;
    void func(int _a) {
        this->_a = _a;
    }

};
在引用依赖于当前类的模板参数的基类成员时,还需要

this

否则,没有必要使用this

答案 1 :(得分:4)

在一般情况下,你可以同时使用两者。在这种情况下,这只是一种风格问题,正确的做法是遵循项目的风格指南。在这方面,一致性比个人偏好更重要。

但是,使用this->有两种情况可以产生影响。一种是当成员函数具有与成员同名的参数时;在这种情况下,参数的名称会隐藏成员的名称,您必须使用this->来引用该成员(首先由@ Krypton的答案指出):

void Abc::fun(int a_)
{
  a_ = 3;  // assigns into the parameter
  this->a_ = 3;  // assigns into the data member
}

另一种情况是,当您在类模板中工作时,该成员继承自基类,该基类依赖于类模板的模板参数。在这种情况下,非限定查找不会搜索依赖上下文,因此将找不到该成员。使用this->将访问转换为依赖表达式,该表达式将在实例化时查找,从而正确地解析为成员。例如:

template <class T>
struct Base
{
protected:
  T a_;
};


template <class T>
struct Abc : Base<T>
{
  void fun() {
    a_ = 3;  // error, not `a_` in scope
    this->a_ = 3;  // OK, found at instantiation time
  }
};

在这种情况下,存在另一种解决方案:明确显示名称:

template <class T>
struct Abc : Base<T>
{
protected:
  using Base<T>::a_;

public:
  void fun() {
    a_ = 3;  // OK, found thanks to `using` declaration
  }
};

答案 2 :(得分:1)

我认为这更像是一种风格问题。使用额外的this->不会更改生成的代码。

虽然你不能在构造函数体之前的类成员初始化中使用operator this->,比如

class Abc {
public:
    Abc(int i): /*this-> is incorrect*/i(i) {}
private:
    int i;
};

我更喜欢使用this->与其他无类成员有明显区别。 然后像下面这样的代码更具可读性

void foo(int i) { }
class Abc {
public:
    Abc(int j) { this->foo(j); }
private:
    void foo (int i) { this->i = i; }
    int i;
};

有些人将以m_开头的班级数据成员命名为m_im_j

一些现代IDE支持语义语法突出显示,这也有助于区分局部变量,类数据成员,全局变量,函数。