在c ++中使用Concent语法
关键字 this 是指向对象(类)本身的指针,将*置于此前面与取消引用指针相同。
因此,请说该课程有私人成员
private:
int a = 10;
我创建了以下语法:
(*this).a = obj.a;
可以在重载“=”运算符
时使用它看起来有点奇怪,因为看起来类成员“a”指的是它自己 - 但它是一个有效的语法!!!
然后我的问题是 - 如果该声明有效 - 为什么可能无法按以下方式编写声明:
obj.a = obj.a;
???
我在 Eclipse 中遇到以下错误:
任务ti本身
答案 0 :(得分:4)
严格来说,自我指派没有任何违法行为。 Eclipse只是警告你,因为它是一件愚蠢的事情。它应该不做什么是错误的,因为它不是错误。在这种情况下,你只是遇到Eclipse正在使用的静态分析器的限制,它无法弄清楚它是否是同一个东西,而obj.a
显然是与obj.a
相同。
答案 1 :(得分:2)
obj.a = obj.a;
Eclipse正在警告你一个明显的自我分配。
(*this).a = obj.a;
通常,*this
与obj
不是同一个实例,如果是,则这可能只会在运行时变得明显。因此,在这种情况下,Eclipse的静态分析器不会发出警告。
另请注意,您不需要this
:
a = obj.a;
没关系。
答案 2 :(得分:2)
你可以这样写。它是有效的C ++。
Eclipse只是指出这是一件无用的事情。对*(this).a
这样的任意表达式自动检测它只是它的功能之外的一点点。这是因为无法对所有程序进行物理操作。
例如:
void T::foo(T& other)
{
T* ptr = nullptr;
if (rand())
ptr = this;
else
ptr = &other;
T& obj = *ptr;
this->a = obj.a; // cannot be optimised out
}
但是,在其他情况下,从理论上讲,完整的C ++解析引擎可以像编译器的优化器一样完成它。
例如:
void T::foo()
{
T& obj = *this;
this->a = obj.a; // can easily be optimised out
}
在IDE / intellisense中编写代码以尝试解决这些问题并没有什么意义;这不值得。所以它不会尝试。