メソッド/コンストラクターを明示的に指定すると、暗黙的に呼ばれないことがわかりますか?
-
09-10-2019 - |
質問
メソッド/コンストラクターを明示的に指定すると、暗黙的に呼ばれないことがわかりますか?私は、コンストラクターが明示的として指定されている場合、=のような演算子によって暗黙的に呼ばれることはできません。
その場合、メソッド/コンストラクターを明示的に指定することはまったく重要ですか?メソッド/コンストラクターを明示的に指定することの利点は何ですか?
解決
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
このような上記のようなラインでは、プログラマーが何か違うことを念頭に置いていることが非常によくあり、この変換はまったく意図的ではありません。