Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么时候是';这';必修的?_C++ - Fatal编程技术网

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);