2

この単純化された例では、私の質問は次のとおりです: Action::setUser() 内で正当な代入を行っていますか?

class User {
private:
   int age;
public:
   int getAge() { return age; }
};

class Action {
private:
   User user;
public:
   void setUser(User &u) {
      user = u;
   }
};

int main() {
   User u;
   Action a;
   a.setUser(u);
   return 0;
}

私を騒がせているのは、

  • setUser が呼び出されると、Action の「user」属性はどうなりますか? それは破壊されていますか?それは今までに構築されましたか?
  • setUser をもう一度呼び出すとどうなりますか?
  • setUser の "&" 記号を削除すれば、すべて問題ありませんよね? それは、パラメーターのコピーを渡すようなものだからですよね?

属性が正しく破棄されていないため、メモリでクレイジーなことをしているのではないかと心配しています...

ありがとうございました


編集日: 2013 年 2 月 18 日

どうもありがとう!皆様の回答、本当に有難う御座いました…

コンパイラがデフォルトのオーバーロード代入演算子を提供していることを知りませんでした。今では、すべてが完全に理にかなっていることがわかりました...

再度、感謝します。

4

4 に答える 4

4

setUser が呼び出されると、Action の「user」属性はどうなりますか?

代入演算子(カスタムのものを定義していないため、コンパイラによって提供されます) が呼び出されます。これは、からuへのメンバーごとのコピーを実行するだけuserです。

それは破壊されていますか?

いいえ。

建設されたことはありますか?

はい。

setUser をもう一度呼び出すとどうなりますか?

同じこと。

setUser の "&" 記号を削除すれば、すべて問題ありませんよね?

への割り当てuserに関する限り、これは違いはありません。参照渡しとは、関数が呼び出されたときに引数のコピーが作成されないことを意味します。

于 2013-02-17T00:42:33.113 に答える
1

はい、大丈夫です。umain で定義したfrom を直接 に割り当てるだけですa.user。参照パラメータは、 に渡す余分なコピーを作成することを回避しますa.setUser

を作成するActionと、デフォルトで構築されたUserオブジェクトが含まれます。次に、それに値を割り当てますUser。これは (IMO) 最適な設計ではありません (むしろUser、正しい値で構築されたものを見たいと思います) が、すべて完全に有効です。

割り当ては、既存の値を作成または破棄するために何もしません。オブジェクトはActionスコープ外に出ると破棄され、User含まれているオブジェクトも破棄されます。

于 2013-02-17T00:43:21.070 に答える
1

答え:

  • 破棄せずに上書き(コピー代入)します。はい、それは以前に構築されました。
  • 初回と同じ。
  • を削除した場合&は、コピーを渡します。しかし、それは物事を間違ったり正しくしたりしません。

ノート:

  • メンバー関数と渡されたパラメーターの両方で const を使用します。
  • 少なくとも、コピーと割り当てを制御することを検討する必要があります。これについては、より適切な C++ の紹介または FAQ で説明する必要があります。
于 2013-02-17T00:44:12.893 に答える
1
class Action {
private:
   User user;
}

タイプ のプライベート メンバーを定義しますUser。タイプのオブジェクトが構築されている間に構築されたのは、自動保存期間を持つオブジェクトですAction。その存続期間は、 type のオブジェクトの存続期間に関連付けられていますAction

今この方法で:

void setUser(User &u) {
    user = u;
}

u代入演算子userを使用して属性を設定するために使用される属性 (メンバー) を持つオブジェクトへの参照です。

ここを削除&すると、参照渡しから値渡しに変更されます。つまり、このメソッドに渡されたオブジェクトのコピーが呼び出し時に作成されます。

于 2013-02-17T00:44:51.583 に答える