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

Utk*_*ari 13 c++ this

class C{
   //methods and properties
}

void C::some_method(C* b){
    delete this;
    this = b;     
}
Run Code Online (Sandbox Code Playgroud)

这在编译时给出了以下错误:

error: lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

bas*_*h.d 16

this终场前是一个隐含的指针,以在其上下文你正在工作的对象,则无法重新分配它.

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

C * const this
Run Code Online (Sandbox Code Playgroud)

意味着你有一个指向你的类C常量指针,所以如果你试图改变它,编译器会抱怨.

编辑:

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


Ton*_*ion 15

你不能改变this指向的东西.我也不知道你为什么要这样做.

  • @kol 实际上你不能,除非你的编译器严重损坏(或严重老化——你可以直到 1990 年之前,当语言中添加了重载 `operator new` 的可能性时)。 (2认同)

Jam*_*nze 14

引用标准:

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

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

如果我写下这样的话,我真的很好奇你期望发生什么:

int
main()
{
    C c1;
    C c2
    c1.some_method( &c2 );
}
Run Code Online (Sandbox Code Playgroud)

你期望的地址c1以某种方式奇迹般地改变,并c1c2以别名相同的对象?(而且c1.some_method( NULL )更令人沮丧.)

  • @kol实际上,你做不到,而你的回答是完全错误的.标准在这里很清楚:`this`是一个prvalue(或者在C++ 11之前的rvalue),并且赋值给rvalue是非法的,并且有_no_方式从非类的rvalue获取一个左值类型. (2认同)

Don*_*sto 6

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

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

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

int main()
{
 Foo foo;
 foobar = foo; //invoke operator= overwrited method
}
Run Code Online (Sandbox Code Playgroud)