18
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/

也许,它可能会得到我想要的效果。

4

6 回答 6

22

-pointerthis是指向您正在其上下文中工作的对象的隐式指针,您不能重新分配它。

根据 Stroustrup 的圣经(The C++ Programming Language, 3rd edition I have)this表示为

C * const this

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

编辑:

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

于 2013-08-14T09:12:41.040 回答
15

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

于 2013-08-14T09:12:46.420 回答
14

引用标准:

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

“prvalue”是一个纯右值,类似于42or 3.14159。以同样的方式,你不能做类似的事情42 = x,你不能分配给this; 在这两种情况下(至少在概念上),没有一个对象的值可以改变。

我真的很好奇如果我写这样的东西你会发生什么:

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

您是否期望 的地址c1以某种方式奇迹般地改变,并c1成为c2同一个对象的别名?(而且c1.some_method( NULL )更有趣。)

于 2013-08-14T09:45:22.420 回答
6

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

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

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

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


于 2013-08-14T09:13:15.703 回答
1

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

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

// do some work perhaps ...

delete c1;
c1 = c2;

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

于 2013-08-14T11:52:33.577 回答
1

错误显示“您不能分配bthis”。据我所知,this这是您无法更改的,因为它不是实际的指针,而是自引用。

于 2013-08-14T09:18:35.057 回答