1.定義
型変換演算子:(クラス型は引数型オブジェクトから暗黙的に変換できるため)クラス型の値を他の型に変換することもできます。
形式:演算子type()const
typeは特定の型を表し、型変換型が関数の戻り型として使用できる限り、演算子は任意の型(voidを除く)に対して定義できます。
ユーザー定義のクラス型変換=変換コンストラクター+型変換演算子
例えば。
class SmallInt{
public:
SmallInt(int i= 0):val(i)
{
if(i < 0 || i > 255)
throw std::out_of_range("Bad SmallInt value");
}
operator int() const{
return val;}
private:
std::size_t val;
}
コンストラクターは算術型の値をSmallIntに変換し、型変換演算子はSmallIntオブジェクトをintに変換します。
暗黙的なユーザー定義型変換は、標準(組み込み)型変換の前または後に配置できます。
SmallInt si;
si = 4; //首先将4隐式转换成SmallInt,然后调用SmallInt::operator=
int n = si + 3;//首先将si隐式地转换成int,然后执行整数加法
cout << n << endl;//调用lambda函数对象
2.設計原則
- 型変換演算子は、クラスの特別なメンバー関数であり、クラス型の値を別の型に変換する役割を果たします。
- 配列または関数型への変換は許可されていませんが、ポインター(配列ポインター、関数ポインターを含む)または参照型への変換は許可されています。
- 戻り値の型、仮パラメータなし
- 通常、変換するオブジェクトの内容は変更しないでください。したがって、型変換演算子は通常、constメンバーとして定義されます。
- 型変換関数の過度の使用は避けてください。
例えば。
class SmallInt{
public:
//编译器不会自动执行这一类型转换
int operator int() const;//error:指定了返回类型
operator int(int = 0) const;//error:指定了形参
}
3.暗黙的な型変換
3.1暗黙的に予期しない結果が生じる可能性があります
例えば。
//使用 istream 的 bool 类型转换运算符将 cin 转换成 bool, 可能会变成1或0左移42位
int i = 42;
cin << i;
3.2暗黙的な変換を防ぐために、explicitを使用して明示的な型変換演算子を指定すると、明示的な強制を使用できます。
class SmallInt{
public:
//编译器不会自动执行这一类型转换
explicit operator int() const {
return val;}
}
//显式地请求类型转换
SmallInt si=3;
int n = si + 3;//error
static_cast<int>(si)+3;//
- 注:boolへの型変換は通常、条件部分で使用されるため、演算子boolは通常明示的として定義されます。
- 新しいC ++ 11標準では、IOライブラリは演算子boolへの明示的な型変換を定義します
while(cin >> value)
入力演算子は、データを値に読み取り、cinを返す責任があります。条件を評価するために、cinはistream演算子のブール型変換関数によって暗黙的に変換されます。cinの条件ステータスが良好な場合、関数はtrueを返します。それ以外の場合、関数はtrueを返します。 falseを返します。
3.3。式が次の位置にある場合、明示的な型変換は暗黙的に実行されます。
- if、while、doステートメントの条件付き部分。
- forステートメントの先頭にある条件式。
- 論理NOT(!)演算子、論理AND(&&)演算子、論理OR(||)演算子。
- 条件演算子の条件式(?:)。
[見積もり]