13

私はC++のチュートリアルを読んでいますが、実際には2つの違い(構文以外)はわかりませんでした。以下はチュートリアルからの引用です。

宣言時に変数に値を割り当てることもできます。代入演算子 (等号) を使用して変数に値を代入すると、明示的な代入と呼ばれます。

int nValue = 5; // explicit assignment

暗黙的な割り当てを使用して変数に値を割り当てることもできます。

int nValue(5); // implicit assignment

暗黙的な代入は関数呼び出しによく似ていますが、コンパイラはどの名前が変数で、どの名前が関数であるかを追跡して、適切に解決できるようにします。

違いはありますか?どちらが優先されますか?

4

3 に答える 3

13

int1つ目は、;のようなプリミティブ型で優先されます。2つ目は、コンストラクター呼び出しを明示的にするため、コンストラクターを持つ型を使用します。

class Fooたとえば、単一のから構築できるを定義した場合int

Foo x(5);

よりも優先されます

Foo x = 5;

(複数の引数が渡される場合は、Foo x = Foo(5, "hello");単純に醜く、呼び出されているように見えるものを使用しない限り、とにかく前者の構文が必要ですoperator=。)

于 2011-07-19T18:06:42.560 に答える
6

プリミティブ型の場合はどちらも同等ですが、違いがあるのはユーザー定義のクラス型です。どちらの場合も、実行されるコードは同じですが (基本的な最適化が実行された後)、初期化元の要素が構築している型でない場合、型の要件は異なります。

copy-initialization ( ) は、暗黙的に からに変換さT t = u;れた一時的な型からのコピー構築と同等です。一方、直接初期化は、適切なコンストラクターへの直接呼び出しと同等です。Tut

ほとんどの状況では違いはありませんが、 を受け取るコンストラクターuが宣言されているexplicitか、コピー コンストラクターにアクセスできない場合、コピーの初期化は失敗します。

struct A {
   explicit A( int ) {}
};
struct B {
   B( int ) {}
private:
   B( B const & );
};
int main() {
   A a(1);      // ok
   B b(1);      // ok
// A a2 = 1;    // error: cannot convert from int to A
// B b2 = 1;    // error: B( B const & ) is not accessible
}

歴史的な背景として、最初はプリミティブ型をcopy-initializationで初期化する必要がありました。*initializer-list* が言語に追加されてクラスのメンバー属性を初期化したとき、プリミティブ型はクラスと同じ構文で初期化して、初期化子リストの構文を均一かつ単純に保つ必要があると判断されました。同時に、コピー初期化によるクラスの初期化を許可することで、ユーザー定義型をプリミティブ型に近づけることができます。2 つの初期化形式の違いは当然のことです。は からへint a = 5.0;の変換として処理され、次に から が初期化されます。同じことがユーザー定義型にも当てはまります。5.0intaintT u = v;vからへの変換として処理され、その変換された値からTのコピー構築が行わuれます。

于 2011-07-19T19:32:41.637 に答える
3

変数を宣言して初期化する場合、そのコンテキストでは機能的に同じです。私は通常、この 2 つを次のように呼びます。

int nValue = 5; // assignment syntax

int nValue(5); // construction syntax

基本型の場合、特に他の言語でプログラミングしたことがある人にとっては、より自然であるため、構築よりも代入を好みます。

クラス型の場合、コンストラクター関数の存在が不要になるため、構築構文を好みます。

于 2011-07-19T18:07:08.877 に答える