将对象的“this”指针更改为指向不同的对象

时间:2013-08-14 09:09:32

标签: c++ this

class C{
   //methods and properties
}

void C::some_method(C* b){
    delete this;
    this = b;     
}

这使我在编译时出现以下错误:

error: lvalue required as left operand of assignment

我的意图: 假设有C类的对象a和b.C类的内容可能非常庞大,并且逐字段复制可能非常昂贵。我希望以经济的方式将“a”的所有内容替换为“b”。

默认复制构造函数会执行预期的任务吗?

我找到了一个叫做'移动构造函数'的东西 http://akrzemi1.wordpress.com/2011/08/11/move-constructor/

也许,它可能会产生我想要的效果。

6 个答案:

答案 0 :(得分:16)

this - 指针是指向您正在其上下文中的对象的隐式指针,您无法重新指定它。

根据Stroustrup的圣经(C ++编程语言,我有第3版)this表示为

C * const this

意味着您的 C 类具有常量指针,因此如果您尝试更改它,编译器会抱怨。

编辑:

正如我纠正的那样,上面提到的表达并没有完全正确地描述this,因为this实际上是一个右值。

答案 1 :(得分:15)

您无法更改this指向的内容。我也不知道你为什么要这样做。

答案 2 :(得分:14)

引用标准:

  

在非静态(9.3)成员函数的主体中,关键字   this是一个prvalue表达式,其值是。的地址   调用该函数的对象。

“prvalue”是纯正的左值,类似于423.14159。 以同样的方式你不能做42 = x之类的事情,你做不到 分配给this;在这两种情况下(至少在概念上),那里 不是价值可以改变的对象。

我真的很好奇你期望发生的事情 我写了类似的东西:

int
main()
{
    C c1;
    C c2
    c1.some_method( &c2 );
}

您是否希望c1的地址奇迹般地出现 更改,并且c1c2是同一对象的别名? (而且c1.some_method( NULL )更令人沮丧。)

答案 3 :(得分:6)

您无法为this分配不同的值,因为它指向对象本身,这没有任何意义。 您可以实例化一个新对象并使用其隐式this指针。

此外,如果您尝试制作对象的副本,则可以覆盖operator=

class Foo
{
  public:
    [...]
    Foo& operator=(const Foo& foo);
}

int main()
{
 Foo foo;
 foobar = foo; //invoke operator= overwrited method
}


答案 4 :(得分:1)

错误显示“您无法将b分配给this”。据我所知,this是你无法改变的,因为它不是一个实际的指针,而是一个自我引用。

答案 5 :(得分:1)

只需使用通常的方法而不是黑魔法和UB:

C* c1 = new C();
C* c2 = new C();

// do some work perhaps ...

delete c1;
c1 = c2;

现在c1是你想要的c2的别名。清理内存时请小心,以免最终删除对象两次。您可能会考虑智能指针......