在IT技术中,this
指针是否必须?如果您需要传递类实例的函数功能,那么您可能需要它。但是在设置/检索/调用/其他成员方面,this
一般可选。
我将此标记为C++,因为我的问题是关于这种语言的,但如果有人可以确认在Java和其他使用this
指针的面向对象语言中,该结构是否相同,将不胜感激。
在IT技术中,this
指针是否必须?如果您需要传递类实例的函数功能,那么您可能需要它。但是在设置/检索/调用/其他成员方面,this
一般可选。
我将此标记为C++,因为我的问题是关于这种语言的,但如果有人可以确认在Java和其他使用this
指针的面向对象语言中,该结构是否相同,将不胜感激。
我可以想到三种情况:
当你只是想传递指向当前类的指针时:
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
或者不依赖于T
的B
基类中找到它的声明。加上this->
使得查找依赖于this
类型,并且由于this
是一个依赖类型,对a
的查找被推迟直到实例化f()
。
可以写成return A::a
而不是return this->a
,但是在存在多个基类(直接或间接)的情况下,使用this->
更加灵活。这种替代语法也仅限于成员变量和非虚函数 - 如果它与虚函数一起使用,则该函数将直接被调用而不是进行虚函数调用。
当局部变量与成员变量同名时,您需要使用它。在这种情况下,局部变量被称为遮蔽成员变量。在这种情况下,您必须使用this
才能访问成员变量。
有些人认为始终使用this
明确指出正在修改的变量是成员变量是好习惯,但并非总是如此。
m_myVar
或 myVar_
等等。由于使用 this
并不是强制性的,大多数项目选择强制规定成员变量的命名标准。 - Andreas Magnussonthis
是一个好习惯。只有在存在变量名遮蔽的情况下才使用它。通常也可以避免使用遮蔽变量名。 - Peter Woodthis
是一个好的习惯。我猜这里有一些争议哈哈。感谢你的有益回答。 - prelicForm1 f = new Form();
f.ShowDialog(this);
this
是可选的。在您的第二个示例中,使用构造函数初始化列表是C++的惯用法,并且不会出现歧义问题,例如A::A(int a) : a(a) {}
是有效且不会产生歧义(至少对于编译器而言)。 - Andreas Magnussonthis
,即如果要调用虚成员函数。然后C :: f()
和this->f()
可能不等价。 - PhilippA<T>::base_function()
和this->base_function()
的问题,两种方式都可以使用,选择哪一种取决于你希望表达的意思。通常情况下,使用this->
更直接,可以解决相关名称的依赖问题。但是使用A<T>::
也有其它影响:它不会首先在B
中查找名为base_function
的函数,并且即使base_function
是虚函数,也不会调用虚分派。 - je4d