メソッド/コンストラクターを明示的に指定すると、暗黙的に呼び出すことができないということですか? つまり、コンストラクターが明示的に指定されている場合、= のような演算子やコンバーターコンストラクターのような他のメソッドによって暗黙的に呼び出すことはできませんか?
その場合、メソッド/コンストラクターを明示的に指定することはまったく重要ですか?メソッド/コンストラクターを明示的に指定する利点は何ですか?
メソッド/コンストラクターを明示的に指定すると、暗黙的に呼び出すことができないということですか? つまり、コンストラクターが明示的に指定されている場合、= のような演算子やコンバーターコンストラクターのような他のメソッドによって暗黙的に呼び出すことはできませんか?
その場合、メソッド/コンストラクターを明示的に指定することはまったく重要ですか?メソッド/コンストラクターを明示的に指定する利点は何ですか?
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
上記のような行では、プログラマーが別のことを考えていて、この変換がまったく意図されていないことがよくあります。