8

重複の可能性:
コピーと直接初期化の動作が異なる理由は何ですか?

そして、コピーの初期化とは、次のように意味します。

struct MyStruct
{
    MyStruct(int) {}
    MyStruct(const MyStruct&) {}
};

MyStruct s = 5; // needs *both* the int and copy constructor

何年もの間 C++ でプログラミングを行っていましたが、上記のコードにコピー コンストラクターが必要であることに気づきませんでした (jogojapan に感謝します)。一時的なものは常に省略されていたので、指摘されるまで、それが存在することすら知りませんでした(少なくとも表面的なレベルでは、最適化されているにもかかわらず)。

かなりの量のグーグルの後、私はそれがどのように機能するかを理解します。私の質問は、なぜそれがそのようになっているのですか?

上記の例でコピー コンストラクターが不要になるように、標準で作成しなかったのはなぜですか? このタイプの初期化でコピーコンストラクターを要求することが重要であることを示す特定のケース/例はありますか?

なぜそうなっているかについての適切な説明がなければ、私はこれを迷惑なアーティファクトと見なすだけですが、何か重要なものが欠けている場合は、無知である必要はありません.

4

1 に答える 1

0

オブジェクトのコピー初期化は、直接初期化とあいまいです。値を互いに等しく設定するために、どちらも同じ程度に使用できます。

int a = 4;
int a = int(4);
int a(4);

これらの呼び出しはすべてあいまいで、すべて 4 に等しく設定されます。整数の場合のコピー コンストラクターの理由は利便性です。これのない C++ データ型を想像してください。

int a(foo(b,r)); //a little messy for a variable declaration
int a = foo(b,r) //ok, cleaner

暗黙的および明示的なコピー コンストラクターを使用することもできます。これは、コピー コンストラクターを明示的に使用して虚数を処理するプログラムの例です。

#include <iostream>
using std::cout;
using std::endl;
class complexNumbers {
  double real, img;
public:
  complexNumbers() : real(0), img(0) { }
  complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; }
  explicit complexNumbers( double r, double i = 0.0) { real = r; img = i; }
  friend void display(complexNumbers cx);
};
void display(complexNumbers cx){
  cout<<&quot;Real Part: &quot;<<cx.real<<&quot; Imag Part: &quot;<<cx.img<<endl;
}
int main() {
  complexNumbers one(1);
  display(one);
  complexNumbers two =2;
  display(200);
  return 0;
}
于 2012-12-04T04:37:00.510 に答える