int main() {
int theInt = 5;
/**
* Constructor "Example(int val)" in effect at the statement below.
* Same as "Example exObject(theInt);" or "Example exObject = Example(theInt);"
*/
Example exObject = theInt; // 1
Example ctr(5);
/**
* "operator unsigned int()" in effect at the statement below.
* What gets assigned is the value returned by "operator unsigned int()".
*/
int theInt1 = ctr; // 2
return 0;
}
コンストラクタExample(int val)
が呼び出されます。 explicit Example(int val)
と宣言すると、コンパイル時エラーが発生します。つまり、暗黙の変換はこのコンストラクタでは許可されません。
割り当てられた値がそれぞれの引数型の場合、すべての単一引数のコンストラクタが暗黙的に呼び出されます。単一の引数コンストラクタの前にexplicit
キーワードを使用すると、暗黙のコンストラクタ呼び出しが無効になり、暗黙の変換が無効になります。
コンストラクタが明示的に宣言された場合、つまりexplicit Example(int val)
の場合、各文に対して次のようになります。
Example exObject(theInt); // Compile time error.
Example exObject = theInt; // Compile time error.
Example exObject(Example(theInt)); // Okay!
Example exObject = Example(theInt); // Okay!
また、暗黙のコンストラクタコールの場合、暗黙の変換の場合、割り当てられた値はrvalueです。非指定されたオブジェクトは、暗黙のうちにドン」(C++ 11に)暗黙の型変換の場合には、コンパイラがそう
Example exObject = Example(theInt);
に
Example exObject = theInt;
を変換していることを教えてくれる左辺値(theInt)を使用して作成しましたlvalueコンストラクタが呼び出されることを期待しています。左辺値、つまり割り当てのために名前付き値theInt
を使用しています。割り当てられた値は実際には左辺値を使用して作成された名前のないオブジェクトなので、右辺のコンストラクタが呼び出されます。ただし、lvalueとrvalueの両方のコンストラクタがある場合は、これが適用されます。
at文2 operator unsigned int()
が呼び出されます。奇妙な名前を持つ通常の関数呼び出しと、暗黙的な変換が発生したときに自動的に呼び出されるという事実を考えてください。その関数が返す値は、式に代入された値です。そしてあなたの実装では返される値は正しくint theInt1
に割り当てられるintです。
正確にはoperator unsigned int()
は、キャスト演算子である()
演算子をオーバーロードします。あなたのケースでは、int
のためにオーバーロードされます。したがって、Example
クラスのオブジェクトがint
に割り当てられると、Example
からint
への暗黙の型キャストが発生し、したがってoperator unsigned int()
が呼び出されます。したがって、
int theInt1 = ctr;
は@Zuzu
int theInt1 = (int)ctr;
と同等です:私はあなたが 'std名前空間を使用している気づく;'ファイルの先頭近く。私は、あなたの講師や教材にこれが好きだと推測しています。この例では必要ではありませんが、使用する場所には注意してください。 **ヘッダーファイルでこれを使用することは決してありません - あなたは 'std'名前空間にある名前を自分自身で使いたいなら、悲しみを抱かせることがあります。あなたは私のような場合は、モジュール(.cppファイル)とすべての#includeの後で、関数とメソッドの定義の前に使用したいと思うかもしれません。 – quamrana
あなたの質問は何ですか? –