C++ 什么时候是';这';必修的?
是否需要C++ 什么时候是';这';必修的?,c++,C++,是否需要这个指针?如果您在函数上传递由this指向的类的实例,我想您会需要它。但是在设置/检索/调用/任何成员方面,这是否总是可选的 我已经标记了这个C++,因为这是我特别想知道的语言,但是如果有人能确认java和其他OO语言使用的是一个< >这个代码>,那么我们会很感激。 当你有一个与成员变量完全相同的局部变量时,你需要它。在这种情况下,称局部变量为成员变量的影子。要在这种情况下访问成员变量,必须使用this 一些人认为,通过使用 < < /代码>始终明确地指出,正在修改的变量是一个成员变量
这个指针?如果您在函数上传递由this
指向的类的实例,我想您会需要它。但是在设置/检索/调用/任何成员方面,这是否总是可选的
我已经标记了这个C++,因为这是我特别想知道的语言,但是如果有人能确认java和其他OO语言使用的是一个< <代码> >这个代码>,那么我们会很感激。
当你有一个与成员变量完全相同的局部变量时,你需要它。在这种情况下,称局部变量为成员变量的影子。要在这种情况下访问成员变量,必须使用this
一些人认为,通过使用<代码> < < /代码>始终明确地指出,正在修改的变量是一个成员变量,但情况并非总是如此。
< P> >我可以想到三种情况:
当您只想传递指向当前类的指针时:
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{
INTA;
};
模板
结构B:公共A{
int f(){返回此->a;}
}
在这里,a
本身并不是一个依赖名称,因此编译器希望在B
中找到它的声明,或者在B
中找到一个不依赖于T
的基。添加this->
使查找依赖于this
的类型,并且由于this
是一种依赖类型,因此a
的查找延迟到f()
被实例化
可以编写返回A::A
而不是返回this->A
,但是在存在多个基的情况下,无论是直接的还是间接的,使用this->
更灵活。此替代语法也仅限于成员变量和非虚拟函数-如果与虚拟函数一起使用,则将直接调用该函数,而不是执行虚拟函数调用。有时需要“This”,可能是在将对象传递给另一个函数时。
查看此c代码(用于使用此父级打开模式表单)
对于C++,你的最后一个考虑是正确的,但是对于java或C语言,这并不总是惯例,这就是为什么你总是用不同的名字来命名你的成员变量,例如:代码> MyMyVa/Cudio>或者<代码> MyValu等等。由于没有强制使用这个
,大多数项目选择在成员变量上强制使用命名标准。我不认为一直使用这个
是一种好形式。仅当有阴影名称时才使用它。通常阴影也可以避免。严格来说,在这种情况下,这是不必要的,因为您也可以说classname::variable@Oleksi-我还想知道使用这个
是否是一种好的做法。我猜那里有一些争论哈哈。感谢您提供的有用答案。您可以始终使用classname::variablename来访问它,因此这可以用于它,但不是必需的。事实上,只有您的第一个示例是正确的,对于其他两个示例,this
的使用是可选的。在第二个例子中,使用cor初始化器列表是习惯性C++,不会有歧义问题,例如,代码> A::A(int A):A(A){} /COD>有效且不含糊(至少对于编译器)。对于3版<代码>,也可以要求这个< /C>。那么C::f()
和this->f()
可能是不同的。@AndrewLazarus我建议忽略与Andreas的整个对话。我为没有结束这件事而道歉,但这件事看起来很琐碎,我觉得很无聊。我认为我对这个问题的解释比其他人更为宽泛,文体问题被作为附带损害而拖了进来。这个问题不是关于什么更好,所以你不可能在这里得到关于这个主题的有用讨论。现在,关于a::base_function()
和this->base_function()
的问题,两者都不可取,它们是不同的。你应该选择哪一个更好地表达你想要达到的目标。这个->
变体通常是您想要的,它是解决依赖名称问题的直接方法。使用<代码>::/COD>有附加的效果:它不会在<代码> B/<代码>中查找名为“代码> BaseType < /Cube >的函数,即使<代码>基函数是虚拟的,也不会调用虚拟调度。这看起来不像C++。问题是关于C++的。
Form1 f = new Form();
f.ShowDialog(this);