『C++Primer』隠蔽タイプ変換学習整理

1577 ワード

C+++Primerの中には、1つのパラメータで呼び出すことができる構造関数が、イメージタイプからこのタイプへの変換を定義しています。この文は次のコードで表しています。

class A
{
  A(B b);//         
  func(A a);
} 
.....
A a;
B b;
a.func(b);//func       A     ,             ,  B     b              A    ,    。          
上記のコードセグメントから見ても、単一の実際参照で呼び出されたコンストラクタは、クラスタイプから他のタイプへの変換を定義し、このような変換は暗黙的に発生し、ここにはいくつかのキーワードがあります。
暗黙的な変換の過程で何が起きましたか?オブジェクトaにはパラメータタイプがBのメンバー関数ではありませんが、単一のBクラスのモザイクの構造関数がありますので、コンパイルする時にはエラーが発生しません。a.func(b)この文に対して、コンパイラはこの特殊なコンストラクタを使って、一時的なオブジェクトを生成し、正規のfunc(A a)関数を一時的なオブジェクトで呼び出します。func(A a)関数は終了し、一時的なオブジェクトはログアウトされます。
このような転換は結局良いですか?種類によって違います。使う言語の状況によって違います。あなたはいつもそれが必要な時もあれば、それを望んではいけない時もあります。言語はデフォルトでこの機能があります。しかし、このような見えない「最適化」をキーワードにexplicitで阻止することもできます。explicitキーワードはコンストラクタのみに使用できます。また、関数の宣言時に表記すればいいです。クラス関数の定義時にキーワードを表示する必要はありません。
上記の例では、構造関数A(B b)による暗黙的なタイプの変換を阻止すると、この構造関数の声明は次のように処理され得る。

explicit A (B b)
この時、文a.func(b)が間違っていますが、構造関数を明示的に使って、上記の例を例にとって、文を使ってもいいです。

a.func(A(b))
同じ機能が完了した場合、暗黙的な変換は行われません。A(b)は、一時的なAタイプのオブジェクトを生成し、関数funcに伝達して呼び出し、すべて規則に従って、暗黙的な、プログラマには見えないステップがない。表示されたコンストラクタは非表示的にコンストラクタの使用を中止し、任意のコンストラクタは明示的に一時的なオブジェクトを作成することができます。これはその権利です。explicitによって修飾されたコンストラクタも例外ではありません。
暗黙的なタイプの変換については、「C+++Primer」の著者は以下のような心得を持っています。通常、明示的な理由がない限り、暗黙的な変換を定義する必要があります。コンストラクタをexplicitに設定すると、エラーを回避でき、変換が有用である場合、ユーザはオブジェクトを明示的に構成することができる。
ここでは、「C++Primer」の暗黙的なタイプについて学習整理の文章を紹介します。これに関連して、c++の暗黙的なタイプの変換内容を紹介します。以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。