メソッド/コンストラクターを明示的に指定すると、暗黙的に呼ばれないことがわかりますか?

StackOverflow https://stackoverflow.com/questions/4427144

質問

メソッド/コンストラクターを明示的に指定すると、暗黙的に呼ばれないことがわかりますか?私は、コンストラクターが明示的として指定されている場合、=のような演算子によって暗黙的に呼ばれることはできません。

その場合、メソッド/コンストラクターを明示的に指定することはまったく重要ですか?メソッド/コンストラクターを明示的に指定することの利点は何ですか?

役に立ちましたか?

解決

class MyClass
{
    int i;
    MyClass(YourClass &); 
};

class YourClass
{
    int y;

};

void doSomething(MyClass ref)
{
    //Do something interesting over here

}

int main()
{
    MyClass obj;
    YourClass obj2; 

    doSomething(obj2);
}

のコンストラクター以来の例で MyClass 明示的として指定されていないため、関数を呼び出す際に暗黙的な変換に使用されます doSomething(). 。のコンストラクターの場合 MyClass 明示的としてマークされている場合、コンパイラは呼び出し中に暗黙の収束の代わりにエラーを与えます doSomething() 働き。したがって、そのような暗黙の変換を避けたい場合は、 explicit キーワード。

上記に追加するには:キーワード explicit 機能ではなく、コンストラクターにのみ使用できます。より多くのパラメーターを持つコンストラクターに使用できますが、コンパイラは暗黙的な変換に1つのパラメーターを持つコンストラクターのみを使用できるため、複数のパラメーターを持つコンストラクターのキーワードの実用的な使用はありません。

他のヒント

関数は指定子を明示することはできません。 FNCが明示的な仕様を持つことは意味がありません。 CTORについては、Qに対する答えはイエスです。 CTORは明示的であると述べると、それを暗黙的に呼ぶことは違法であることを意味します。
いつ役に立ちますか?たとえばあなたのクラスの場合:

class X
{
X(char){/*something really cool*/}
};

そして後でコードで書きます:

X _1 = 'a';//this line will call conv ctor

このような上記のようなラインでは、プログラマーが何か違うことを念頭に置いていることが非常によくあり、この変換はまったく意図的ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top