その答えは、元のオーバーフロースタックから取得されます:何が平均で明示的なキーワードをしますか?
関数のパラメータの要件を満たすために、可能な限り一回の暗黙の型変換を行われている変数が一致しない場合のパラメータは、関数に渡された場合、C ++コンパイラ。暗黙の型変換は、単一の引数のコンストラクタ呼び出し変換対象が参加するには、次の暗黙的な変換の例です。
1 |
クラス |
関数Foo
パラメータとしてオブジェクト。
1 |
大专栏 (译)明示的なキーワードは何を意味するのでしょうか?小娘= "行"> 無効 DoBar (フー・FOO) |
今、私たちは、次の呼び出しDoBar
機能を:
1 |
int型 の主 () |
明らかに、引数の型はないがFoo
、しかしint
、しかしでFoo
構築されたオブジェクトを受け入れるようにint型の単一のパラメータを持つオブジェクトのコンストラクタなので、コンパイラが暗黙的にするために、このコンストラクタを呼び出しますint
変換しますFoo
。
ディスプレイを指定するには、このコンストラクタは、explicit
それは我々は再びそれを使用する場合、コンパイラはこのような変換を禁止します、暗黙的な変換のこのタイプを望んでいないコンパイラ指示しDoBar(42)
、それはエラーになりますが。
このキーワード理由を作るための理由は、いくつかの微妙なバグをもたらすために、私たちのプログラムを与える可能性があるため、この暗黙の型変換コンパイラです。たとえば、次のようにクラスのコンストラクタがあります。MyString(int size)
この文字初期3の長さを示します。あなたはこの関数を呼び出しprint(const MyString&)
、この文字が、あなたが書いたずさんなコードを印刷したいですprint(3)
。あなたはそれが文字「3」が、実際に戻り、空の文字列と3の長さをプリントアウトすることですたいです。
プログラミング推奨:一般的にプラス(マルチパラメータデフォルトパラメータを持つコンストラクタを含む)単一引数のコンストラクタのために必要explicit
。