什么时候需要'这个'?

时间:2012-03-07 20:44:20

标签: c++

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

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

3 个答案:

答案 0 :(得分:13)

我能想到的有三种情况:

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

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

struct B {
    A* a;
    B() : a(new A(this)) {}
}; 

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

struct A {
    int a;
    void set_a(int a) { this->a = a; }
};

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

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


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

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

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

这里,a单独不会是依赖名称,因此编译器希望在BB的基础中找到它的声明,而不依赖于{ {1}}。添加T会使查找依赖于this->的类型,并且由于this是依赖类型,this的查找将延迟到a被实例化

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:-2)

有时候“this”是必需的,也许当你将对象传递给另一个函数时。 看一下这个c#代码(用这个父代打开一个模态表格)

Form1 f = new Form();
f.ShowDialog(this);