0

コンストラクターが明示的である場合、暗黙的な変換には使用されません。指定されたスニペットでは、コンストラクターはとしてマークされていexplicitます。それでは、なぜfoo obj1(10.25);それが機能していて、機能しfoo obj2=10.25;ていないのですか?

#include <iostream>
class foo
{
    int x;
    public:
    explicit foo( int x ):x(x)
    {}
};

int main()
{
    foo obj(10.25);  // Not an error. Why ?
    foo obj2 = 10.25; // Error
    getchar();
    return 0;
}

エラー:エラーC2440:'初期化中':'double'から'foo'に変換できません

4

4 に答える 4

3

これらの2つの初期化形式は、技術的に異なります。最初の(foo obj(10.25);)は直接初期化と呼ばれます。2番目の(foo obj = 10.25;)はコピー初期化と呼ばれます。

explicitコンストラクターは、オブジェクトを明示的に初期化する場合にのみ使用できます。直接初期化は、オブジェクトを明示的に初期化する1つの形式です。明示的な初期化のもう1つの形式は、キャストの使用です。

于 2011-01-16T21:45:46.933 に答える
1

「エラーではない」場合は、明示的な構造です。コンパイラは、あなたが指示したことを実行しています。

于 2011-01-16T21:46:51.450 に答える
1

最初のケースでは、暗黙的にに変換していません。に変換しているので、エラーではありません。Sayingは、オブジェクトを初期化するためのコンストラクターへの直接呼び出しと見なされます。10.25foointfoo obj(10.25)foo

2番目のケースでは、暗黙的にに変換しようとし10.25ていfooます。マークexplicitされたコンストラクターは(あなたが正しく言うように)考慮されないため、エラーが発生します。

于 2011-01-16T21:49:40.067 に答える
1

これらの2行のコードには違いがあります。最初の行、

foo obj(10.25);

コンストラクターを明示的に呼び出して、fooを渡します10.25。この構文は、一般に、コンストラクター呼び出しです。

2行目、

foo obj2 = 10.25;

10.25からを型のオブジェクトに暗黙的に変換しようとしますfoo。これには、暗黙の変換コンストラクターを使用する必要があります。この例では、コンストラクターにマークを付けましたが、explicit使用可能な暗黙の変換コンストラクターがないため、コンパイラーはエラーを生成します。

于 2011-01-16T21:50:40.500 に答える