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

this-pointer は、作業中のコンテキストを持つオブジェクトへの暗黙的なポインターであり、再割り当てすることはできません 。

Stroustrup の聖書 (私が持っている C++ プログラミング言語、第 3 版) によると、次のように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 式です。

「prvalue」は、42orのような純粋な右辺値3.14159です。のようなことができないのと同じよう42 = xに、に割り当てることはできませんthis。どちらの場合も (少なくとも概念的には)、値が変更できるオブジェクトはありません。

そして、私が次のようなものを書いた場合、あなたが何を期待するかについて、私は本当に興味があります:

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

のアドレスがc1何らかの形で奇跡的に変化し、 とc1c2同じオブジェクトのエイリアスになると思いますか? (そして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 に答える