変換関数 (C++)
前のセクションで説明したコンストラクターによる変換では特定のクラス型への 1 種類のオブジェクトは暗黙的に変換できます。ここでは特定のクラス型から別の型への変換を提供する方法について説明します。クラス型からの変換では変換関数を使用して行われます。変換関数は次の構文を使用して :
文法
変換関数名 :
演算子 の 名前 () 型変換変換型名 :
型指定子リストの ptr 演算子 opt
次の例では double を入力するに変換が Money を入力すると変換関数を指定するものです :
// spec1_conversion_functions1.cpp
struct Money {
operator double() { return _amount; }
private:
double _amount;
};
int main() {
Money Account;
double CashOnHand = Account;
}
Account の CashOnHand の初期化が原因 Account 型からの変換ではdouble を入力します。
変換関数はキャストを使用すると (コンストラクター) によって呼び出された関数であるためキャスト演算子 「」と呼ばれます。次の例では型 Money のオブジェクトの現在の値を出力するためにキャストまたは明示的な変換を使用して :
cout << (double)Account << endl;
変換関数は派生クラスから継承されます。変換演算子は型に正確に変換する基本クラスの変換演算子を非表示にします。したがってint 演算子 のユーザー定義関数は基本クラスの 短い演算子 のユーザー定義関数を非表示にします。
暗黙の型変換を行うときに1 種類のユーザー定義の変換関数のみ適用されます。明示的に定義された変換関数がない場合コンパイラはオブジェクトが変換できる中間型を検索します。
あいまいさが生じる変換が必要な場合はエラーが生成されます。あいまいさは複数のユーザー定義の変換が有効であるかユーザー定義の変換組み込みの変換がある場合に発生します。
使用例
次の例はあいまいさのクラス宣言を示しています :
// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>
struct String {
// Define constructor that converts from type char *.
String( char *szBuffer ) {
strcpy_s( _text, szBuffer );
}
// Define conversion to type char *.
operator char *() {
return _text;
}
int operator==( const String &s ) {
return !strcmp( _text, s._text );
}
private:
char _text[80];
};
int main() {
String s( "abcd\0" );
char *ch = "efgh";
// Cause the compiler to select a conversion.
return s == ch; // C2666
}
式 s == ch ではコンパイラが適切かを判断する 2 種類の選択と方法はありません。またコンストラクターを使用して String 型のオブジェクトに ch に変換してユーザー定義の operator== を使用して比較を実行できます。も変換関数を使用して char * 型のポインターに s に変換してポインターの比較を実行できます。
どちらの選択は「」正しくないためコンパイラは比較式の意味を判定できずエラーが生成されます。