8

ベクターに格納できるクラスについて質問があります。ベクトルに格納できる要件は何ですか? そのようなクラスには代入演算子が必要なようです。しかし、それだけかどうかはわかりません。

例を挙げましょう。クラス A には const int メンバーがあります。operator = を書かないとコンパイルされません。しかし、この例では、この演算子は何もしません。このプログラムは、10 と 20 を正しく表示します。演算子 = が必要なようですが、実際には使用されていません。

#include <iostream>
#include <vector>

class A {
 public:
  A(int a) : a_(a) {}
  A& operator =(const A& a2) { return *this;} // Without this, compile fails.
  void print() const {
    std::cerr << a_ << std::endl;
  }
 private:
  const int a_;
};

int main(int argc, char** argv) {
  std::vector<A> v;
  v.push_back(A(10));
  v.push_back(A(20));
  for (const A& a : v) a.print();
}
4

4 に答える 4

2

ベクトルの push_back はベクトルをメモリ内で大きくします。つまり、古いオブジェクトを代入 operator= を介して新しいオブジェクトにコピーする必要があるため、代入 operator= が必要です。

于 2013-07-20T11:22:50.900 に答える
-1

独自に作成しない場合、コピー コンストラクターと代入演算子の可用性はコンパイラによって保証されます。(ただし、デフォルトの実装の正確さは別の話です)。あなたの例では、 A::opeartor=() をオーバーロードする必要はほとんどありません。

ここでの問題は「欠落している」operator=() ではありませんが、const データ メンバーを宣言しているため、デフォルトのものは使用できません。

const int a_;

operator=() によって生成されたデフォルトのコンパイラは、値を const メンバーに割り当てることができません。したがって、自分自身をオーバーロードする必要があります。

A & A::opeartor=(const A & in)
{
    *const_cast<int*>(&a_) = in.a_; // !!!you are expected to do this.
}

したがって、何もしない A::operator=() のバージョンは、コードをコンパイルしても、左側のオペランドの a_ 値を変更しません。

于 2013-07-20T11:20:20.543 に答える