2

私のコース ノートには、これら 2 つの例が示されています。どうやら最初のものは許可されていません。スタックに割り当てることができない技術的な理由はありますか? それとも、これは C++ 標準ですか?

   // Constructor may force dynamic allocation when initializating an array of objects.

   Complex ac[10];             // complex array initialized to 0.0
    for ( int i = 0; i < 10; i += 1 ) {
         ac[i] = (Complex){ i, 2.0 } // disallowed
    }


    // MUST USE DYNAMIC ALLOCATION
    Complex *ap[10];            // array of complex pointers
    for ( int i = 0; i < 10; i += 1 ) {
         ap[i] = new Complex( i, 2.0 ); // allowed
    }
4

5 に答える 5

7

最初のものは有効な構文ではありません。Complexただし、クラスにパブリックコピー代入演算子があると仮定すると(暗黙の演算子はおそらく問題ないはずです)、次のように問題ありません。

Complex ac[10];             // complex array initialized to 0.0
for ( int i = 0; i < 10; i += 1 ) {
     ac[i] = Complex( i, 2.0 );
}
于 2011-07-18T13:35:35.433 に答える
6

どうやら最初のものは許可されていません

本当ですが、それは間違った構文を使用しているからです。次の作品:

ac[i] = Complex(i, 2.0);

Complexしたがって、この主張は実際には間違っています(これを割り当てることができると仮定すると、デフォルトでは可能です)–動的割り当ては必要ありません。

于 2011-07-18T13:35:37.377 に答える
2

以下は完全に許可されています-あなたは間違った構文を持っていました。初期化子リストをキャストすることはできませんが、コンストラクターを関数であるかのように呼び出すことができます。

Complex ac[10];  // calls default constructor for each element
for ( int i = 0; i < 10; i += 1 ) {
     ac[i] = Complex(i, 2.0);  // constructs a temporary,
                               // then uses the assignment operator
}
于 2011-07-18T13:34:50.827 に答える
1

もちろん、すべての値を初期化リストに指定することもできます。

Complex ac[] = { Complex(0, 2.0), Complex(1, 2.0), /* and so on */ };

しかし、これはサイズが大きくなるにつれて非常に扱いにくくなります。したがって、ループを使用したいのは当然です。

自動 (通常は「スタック上」に相当する) バッファー内の要素を個別に初期化することは不可能ではありませんが、まったく簡単ではありません。

問題は、配列を定義すると、コンストラクターがすぐに呼び出されることです。配列 (コンストラクターを持たない)を定義してからchar、要素を手動で構築および破棄する必要があります (placement new および明示的なデストラクター呼び出しを使用)。例外の安全性が必要でない限り、これはそれほど難しくありません。例外の安全性が必要な場合は、コーナーケースの処理が非常に困難です。

デフォルト構築してから要素を再割り当てすることが許可されている場合、それは簡単で、他の回答でカバーされています。Complex作業代入演算子がある場合は、これを行う必要があります。

于 2011-07-18T13:37:14.160 に答える
0

コンストラクターが配列に対して動的割り当てを行わなければならないという規則はありません。

ac[i] = Complex( i, 2.0 );

有効です。実際、動的配列はできる限り避けるべきです。

于 2011-07-18T13:37:11.547 に答える