16
int value = 5; // this type of assignment is called an explicit assignment
int value(5); // this type of assignment is called an implicit assignment

それらの違いは何ですか?また、明示的割り当てと暗黙的割り当てはどのような場合にどのように異なりますか?


http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx

編集:私は実際にこの記事を見つけました。これにより、全体がはるかに明確になります...そして、プリミティブ型の単一のパラメーター(numeric / bool / string)をとるコンストラクターを(一般的に)マークする必要がある場合は、別の質問が発生します明示的にし、残りはそのままにしておきます(もちろん、(int, SomeType = SomeType())?のようなコンストラクターなどの落とし穴に注意してください。

4

3 に答える 3

21

これらはどちらもいかなる種類の割り当てでもありません-両方とも初期化です。1つ目はコピーの初期化を使用し、2つ目は直接初期化を使用します。(FWIW、「明示的な割り当て」または「暗黙的な割り当て」という用語を聞いたことがないことは間違いありません)。

編集:(主にネイサンのコメントに応えて):

コメントからのコードの修正バージョンは次のとおりです。

#include <iostream>

struct Foo { 
    Foo() { 
        std::cout << "Foo::ctor()" << std::endl; 
    } 
    Foo(Foo const& copy) { 
        std::cout << "Foo::cctor()" << std::endl; 
    } 
    Foo& operator=(Foo const& copy) { 
        std::cout << "foo::assign()" << std::endl; 
        return *this; 
    } 
};

int main(int, const char**) { 
    Foo f; 
    Foo b(f); 
    Foo x = b;
    return 0; 
}

これを実行した結果は次のようになります。

Foo::ctor()
Foo::cctor()
Foo::cctor()

それを実行してを取得した場合はfoo::assign()、コンパイラを破棄して、機能するコンパイラを取得してください(ああ、それがひどく壊れているコンパイラを教えてください)!

于 2010-06-16T23:30:30.907 に答える
7

クラスに「explicit」とマークされたコンストラクターがある場合、これらは異なります。次に、これらの1つが機能しません。

それ以外の場合、違いはありません。

于 2010-06-16T23:22:11.067 に答える
-1

最初のものだけが割り当てです。どちらも初期化です。

編集:実際、私は間違っています。どちらも割り当てではありません。

于 2010-06-16T23:24:29.860 に答える