2

以前の投稿から、少なくとも、デフォルトのコンストラクターなしで配列を宣言する方法は2つあることを学びました。このような

class Foo{
  public:
  Foo(int i) {}     
};
   Foo f[5] = {1,2,3,4,5};
   Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)}; 

また、最初のコンストラクターはパラメーターを直接使用してオブジェクトを構築し、2番目のコピーコンストラクターがここで使用されることも学びました。ただし、以下のコードをテストすると。コピーコンストラクターをプライベートにします。コピーコンストラクターの使用法の違いがわかると思います。しかし、それは私が期待したものではありません。2つの宣言はどちらも機能していません。

class Foo{
  public:
  Foo(int i) {}     
  private:
  Foo(const Foo& f) {}
};
int main(){

   Foo f[5] = {1,2,3,4,5};
   Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)};      
}

なぜこれが起こるのか誰かが私に説明できますか?

4

1 に答える 1

5

最初のものは、オブジェクトを直接構築しません。最初に一時的なFooを作成し、次にを要素にコピーしFooます。それはあなたの2番目の方法に似ています。explicit違いは、2番目の方法はコピーコンストラクターでは機能しませんが、最初の方法では機能することです。explicit逆に、前者はコンストラクターを使用して機能しませんが、後者は機能しintます。別の言い方をすれば、要素の初期化で使用される最初のコンストラクターはである必要がありますexplicit

どちらの方法もコピーする必要がないことに注意してください。ただし、コピーコンストラクターにアクセスできるかどうかを確認する必要があります。したがって、それらはコピーするかのように動作しますが、実際にはコピーを行う必要はありません。

于 2010-03-06T16:25:38.550 に答える