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/
也许,它可能会产生我想要的效果。
答案 0 :(得分:16)
this
- 指针是指向您正在其上下文中的对象的隐式指针,您无法重新指定它。
根据Stroustrup的圣经(C ++编程语言,我有第3版)this
表示为
C * const this
意味着您的 C 类具有常量指针,因此如果您尝试更改它,编译器会抱怨。
编辑:
正如我纠正的那样,上面提到的表达并没有完全正确地描述this
,因为this
实际上是一个右值。
答案 1 :(得分:15)
您无法更改this
指向的内容。我也不知道你为什么要这样做。
答案 2 :(得分:14)
引用标准:
在非静态(9.3)成员函数的主体中,关键字
this
是一个prvalue表达式,其值是。的地址 调用该函数的对象。
“prvalue”是纯正的左值,类似于42
或3.14159
。
以同样的方式你不能做42 = x
之类的事情,你做不到
分配给this
;在这两种情况下(至少在概念上),那里
不是价值可以改变的对象。
我真的很好奇你期望发生的事情 我写了类似的东西:
int
main()
{
C c1;
C c2
c1.some_method( &c2 );
}
您是否希望c1
的地址奇迹般地出现
更改,并且c1
和c2
是同一对象的别名?
(而且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的别名。清理内存时请小心,以免最终删除对象两次。您可能会考虑智能指针......