C++ベース:C++のexplicitキーワード
C++では、explicitはクラスの構造関数を修飾するために使用され、この構造関数が明示的であり、暗黙的なタイプ変換(implicit type conversion)が発生しないことを示します.すべての単一パラメータの構造関数はexplicitであり、バックグラウンドで発生する暗黙的なタイプ変換を回避する必要があります.そうでなければ、一部のゆったりしたルールでは、表示タイプ変換操作が行われずにタイプ変換が発生する場合があります.通常、この場合、コードの可読性が損なわれ、発見しにくいエラーが発生します.
では、暗黙的なタイプ変換(implicit type conversion)とは何ですか.通常、単一パラメータコンストラクション関数は暗黙的なタイプ変換を定義し、コンパイル時にデフォルトの変換操作を行うことができます.コンストラクション関数に対応するデータ型のデータをクラスオブジェクトの一時オブジェクトに変換し、次の例のように、付与などの操作を互換性のあるものにします.
上記のコードは、MyClassのオブジェクトmyclassを定義し、その値を割り当てます.コンパイラは自動的に完全型をMyClassクラスオブジェクトに変換しますが、実際には次の操作と同じです.
以上の操作は,いわゆる暗黙型変換である.このような自動変換を回避するには、キーワードexplicitを使用してクラスのコンストラクション関数を「表示」と宣言する必要があります.コンストラクション関数を宣言するときにexplicitキーワードを前に追加すると、コードが次のように自動的に変換されることを防止できます.
このように,付与操作を行う際にexplicitが既に使用されているため,単一パラメータの構造関数が暗黙的なタイプ変換ができないことを意味し,コンパイラはこれがタイプ不一致の問題であることを正確に解析できる.
では、暗黙的なタイプ変換(implicit type conversion)とは何ですか.通常、単一パラメータコンストラクション関数は暗黙的なタイプ変換を定義し、コンパイル時にデフォルトの変換操作を行うことができます.コンストラクション関数に対応するデータ型のデータをクラスオブジェクトの一時オブジェクトに変換し、次の例のように、付与などの操作を互換性のあるものにします.
class MyClass
{
public:
MyClass(int num = 0):myValue(num){}
int read() const
{return myValue;}
int write(int x)
{myValue = x;}
private:
int myValue;
}
...
MyClass myclass;
myclass = 10;//this will convert int to MyClass
上記のコードは、MyClassのオブジェクトmyclassを定義し、その値を割り当てます.コンパイラは自動的に完全型をMyClassクラスオブジェクトに変換しますが、実際には次の操作と同じです.
MyClass temp(10);
MyClass myclass = temp;
以上の操作は,いわゆる暗黙型変換である.このような自動変換を回避するには、キーワードexplicitを使用してクラスのコンストラクション関数を「表示」と宣言する必要があります.コンストラクション関数を宣言するときにexplicitキーワードを前に追加すると、コードが次のように自動的に変換されることを防止できます.
class MyClass
{
public:
explict MyClass(int num = 0):myValue(num){}
int read() const
{return myValue;}
int write(int x)
{myValue = x;}
private:
int myValue;
}
このように,付与操作を行う際にexplicitが既に使用されているため,単一パラメータの構造関数が暗黙的なタイプ変換ができないことを意味し,コンパイラはこれがタイプ不一致の問題であることを正確に解析できる.