是否需要this
指针?如果你在函数上传递this
指向的类的实例,我猜你需要它。但是在设置/检索/调用/任何成员方面,this
总是可选的吗?
我已经标记了这个C ++,因为这是我特别想知道的语言,但是如果有人能够确认Java和其他使用this
指针的OO语言的构造是相同的,那么它就是不胜感激。
答案 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
单独不会是依赖名称,因此编译器希望在B
或B
的基础中找到它的声明,而不依赖于{ {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);