什么时候需要'这个'?

pre*_*lic 9 c++

是否this需要指针?如果你在功能上传递指向的类的实例,我想你需要它this.但是在设置/检索/调用/任何成员方面,this总是可选的?

我已经标记了这个C++,因为这是我特别想知道的语言,但是如果有人能够确认Java和其他使用this指针的OO语言的构造是相同的,那么我们将不胜感激.

je4*_*e4d 13

我能想到的有三种情况:

当您只想将指针传递给当前类时:

class B;
struct A {
    B* parent_;
    A(B* parent) : parent_(parent) {}
};

struct B {
    A* a;
    B() : a(new A(this)) {}
}; 
Run Code Online (Sandbox Code Playgroud)

在构造函数或成员函数中,成员被参数遮蔽:

struct A {
    int a;
    void set_a(int a) { this->a = a; }
};
Run Code Online (Sandbox Code Playgroud)

这里,成员变量"a"被参数"a"遮蔽,因此this->用于访问成员而不是参数.

(以上示例编辑为函数而不是构造函数,因为您通常不会在构造函数中指定此方式)


访问模板类的基类中的公共/受保护成员变量或函数时

template <class T>
struct A {
    int a;
};

template <class T>
struct B : public A<T> {
    int f() { return this->a; }
}
Run Code Online (Sandbox Code Playgroud)

在这里,a单独不会是一个依赖名称,所以编译器会期望找到它的声明BB不依赖于它的基础T.添加this->使查找依赖于类型this,并且因为this是依赖类型,查找将a延迟直到f()实例化.

人们可以写return A::a而不是return this->a,但在存在多个基础的情况下,无论是直接还是间接,使用this->都更灵活.这种替代语法也仅限于成员变量和非虚函数 - 如果它与虚函数一起使用,则直接调用该函数而不是进行虚函数调用.

  • 对于#3,也可能需要“this”,即如果要调用虚拟成员函数。那么 `C::f()` 和 `this-&gt;f()` 可能不等价。 (2认同)
  • 现在,关于“ A &lt;T&gt; :: base_function()”和“ this-&gt; base_function()”的问题,两者都不可取,它们是不同的。您应该选择能更好地表达您想要达到的目标的那个。通常,您需要`this-&gt;`变体,它是解决依赖名称问题的直接方法。使用`A &lt;T&gt; :::`还有其他效果:它不会先在`B`中寻找名为`base_function`的函数,并且即使`base_function`是虚拟的也不会调用虚拟调度。 (2认同)

Ole*_*ksi 11

当你有一个与成员变量具有完全相同名称的局部变量时,你需要它.在这种情况下,局部变量被称为遮蔽成员变量.要在这种情况下获取成员变量,必须使用this.

有些人认为通过一直使用明确提到您正在修改的变量是一个成员变量是一个好习惯this,但情况并非总是这样.