explicit constructor(コンストラクション関数を表示)

1874 ワード

デフォルトでは、パラメータが1つしかないコンストラクション関数にも暗黙的な変換が定義されています.このコンストラクション関数に対応するデータ型のデータをクラスオブジェクトに変換します.以下に示します.
class String
{
	String(const char* p) // C      p     
	//........
}

String s1 = "hello"; //OK,    ,   String s1 = String('hello')

しかし、このような暗黙的な変換は必要ない場合があります.以下のようにします.
class String
{
	String(int n) //       n       
	String(const char* p); // C      p     
	//........
}
の次の2つの書き方は正常です.
String s2(10); //OK,   10        
String s3 = String (10); //OK,   10        
しかし、以下の2つの書き方は私たちを困惑させます.
String s4 = 10;  //    ,    10        
String s5 = 'a'; //    ,  int('a')        
s 4とs 5はそれぞれ1つのint型とchar型を暗黙的にいくつかのバイトを割り当てる空の文字列に変換し、誤解されやすい.
このようなエラーを回避するために、explicitキーワードを使用して、表示される変換を宣言することができます.
class String
{
	explicit String(int n) //       n       
	String(const char* p); // C      p     
	//........
}
にexplicitを加えるとString(int n)の暗黙的な変換が抑制される
つまり、次の2つの書き方は依然として正しいです.
String s2(10); //OK,   10        
String s3 = String (10); //OK,   10        

しかし、以前の2つの書き方はコンパイルに合格できませんでした.例えば、
String s4 = 10;  //     ,       
String s5 = 'a'; //     ,       

したがって、explicitは、構造関数の暗黙的な変換によるエラーや誤解を効果的に防止することができる場合がある.
例を挙げてさらに説明する.
explicitは、暗黙的な変換を抑制するために構造関数にのみ機能します.以下のようにします.
class A
{
	A(int a);
};

int Function(A a);

Function(2)が呼び出されると、暗黙的にAタイプに変換されます.このような状況は常に私たちが望んでいる結果ではありません.だから、このような状況を避けるには、このように書くことができます.
class A
{
	explicit A(int a);
};

int Function(A a);

これにより、Function(2)が呼び出されると、コンパイラは誤った情報(Functionにintをパラメータとするリロード形式がない限り)を与え、私たちが知らないうちに発生するエラーを回避することができる.
転載先:http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html