正确使用这个 - >

时间:2011-11-28 17:19:43

标签: java c++ this

正确使用this类的自引用是什么?

我有时在一个方法中使用它来清除所使用的变量是一个成员变量而不是在方法中声明的变量,但另一方面我想知道这是否是一个很好的理由,我认为你应该总是以一种自我解释的方式编码(和评论),因此会不必要地使用this,而另一个原因就是你实际上生成的代码多于你需要的。

void function() {
  while(i != this->length) //length is member var
     /*do something*/
}

我经常遇到的另一种使用它的方法是内部构造函数(主要是Java),因为参数确实与必须初始化的成员变量具有相同的名称。由于Primer表示这是错误的代码,我不这样做,但另一方面,我看到使用与member-vars相同的名称作为参数名称清除了它们的用途。

C++
Constructor::Constructor(int size,int value) : this->size(size),
                                               this->value(value) {};

Java
Constructor(int size,int value) {
  this->size = size;
  this->value = value;
}

我希望实际上有一个规则考虑两种语言(Java / c ++),如果不是我会重新考虑c ++,因为这是我更感兴趣的。

6 个答案:

答案 0 :(得分:10)

在大多数情况下,this->是多余的。例外情况是,如果你有一个同名的参数或局部变量(很容易,也可能是最好的避免),或者在模板中,为了强制使用后面的符号 - 在后一种用法中,它通常是不可避免的

答案 1 :(得分:2)

此处不需要

this,因为只有成员可以在init列表中:

Constructor::Constructor(int size,int value) : size(size), // no need for this->
                                           value(value) {};

this->的唯一其他用途是在模板中。

template <class T>
struct foo : T {
  void bar() {
    this->x = 5; // T has a member named x
  }
};

如果你不必使用它,那就不要。避免使用与构造函数和集合方法之外的其他成员同名的函数参数。

答案 2 :(得分:1)

使用this->明确声明您指的是成员方法/变量。评论说这只是多余的...除非由于某种原因你有一个局部变量 AND 一个具有相同名称的成员变量并且在同一个代码块中以不同方式操作它们,例如:

int x = 7;
this->x = 8; // yes, I really mean the member variable here

答案 3 :(得分:1)

使用this->会增加程序的长度,因此会增加读取它的认知开销。唯一明智的用途是当范围内的某些内容影响了类的成员并且您想要访问该成员时。在大多数情况下,阴影标识符是一个坏主意,gcc(-Wshadow)中有一个编译器开关,有助于避免它。

答案 4 :(得分:1)

在构造函数中使用this不是必需的:编译器足够聪明,可以告诉成员名称中的参数名称。下面的代码片段编译并运行得很好:

Constructor::Constructor(int size,int value) : size(size), value(value) {};

通常,使用this进行消除歧义是有效的,但不必要:正如您所正确指出的那样,您可以简单地为参数和成员使用不同的名称,就是这样。但是,有些情况下您必须使用this,否则事情不会编译。这是一个有点人为的例子 - 使用this设置“后退参考”,如下所示:

class Callback {
    Client *client;
public:
    Callback(Client* client) : client(client) {}
    // ...
}

class Client {
    Callback callback;
public:
    Client() : callback(this) {} // You must use 'this' here
    // ...
}

答案 5 :(得分:0)

我个人更喜欢以某种方式命名我的变量,以便我看到它们是实例变量,例如m_foo。我只使用this->如果编译器要求我由于一些歧义,因为我发现代码有点难以阅读表达式中有很多this->