关键字this - 一个引用自身的类成员

时间:2013-12-17 10:17:17

标签: c++ this

在c ++中使用Concent语法

关键字 this 是指向对象(类)本身的指针,将*置于此前面与取消引用指针相同。

因此,请说该课程有私人成员

 private:
 int a = 10;

我创建了以下语法:

 (*this).a = obj.a;

可以在重载“=”运算符

时使用

它看起来有点奇怪,因为看起来类成员“a”指的是它自己 - 但它是一个有效的语法!!!

然后我的问题是 - 如果该声明有效 - 为什么可能无法按以下方式编写声明:

 obj.a = obj.a;

???

我在 Eclipse 中遇到以下错误:

任务ti本身

3 个答案:

答案 0 :(得分:4)

严格来说,自我指派没有任何违法行为。 Eclipse只是警告你,因为它是一件愚蠢的事情。它应该做什么是错误的,因为它不是错误。在这种情况下,你只是遇到Eclipse正在使用的静态分析器的限制,它无法弄清楚它是否是同一个东西,而obj.a显然是与obj.a相同。

答案 1 :(得分:2)

obj.a = obj.a;

Eclipse正在警告你一个明显的自我分配。

(*this).a = obj.a;

通常,*thisobj不是同一个实例,如果是,则这可能只会在运行时变得明显。因此,在这种情况下,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中编写代码以尝试解决这些问题并没有什么意义;这不值得。所以它不会尝试。