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指向的东西.我也不知道你为什么要这样做.
Jam*_*nze 14
引用标准:
在非静态(9.3)成员函数的主体中,关键字
this是一个prvalue表达式,其值是调用该函数的对象的地址.
"prvalue"是纯粹的右值,类似于42或3.14159.以同样的方式,你不能做类似的事情42 = x,你不能分配this; 在这两种情况下(至少在概念上),没有对象的值可以改变.
如果我写下这样的话,我真的很好奇你期望发生什么:
int
main()
{
C c1;
C c2
c1.some_method( &c2 );
}
Run Code Online (Sandbox Code Playgroud)
你期望的地址c1以某种方式奇迹般地改变,并c1和c2以别名相同的对象?(而且c1.some_method( NULL )更令人沮丧.)
你不能指定一个不同的值,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)
| 归档时间: |
|
| 查看次数: |
9331 次 |
| 最近记录: |