C ++入門書5番目の注意事項(第14章オーバーロード操作と型変換)クラス型変換

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(||)演算子。
  • 条件演算子の条件式(?:)。

[見積もり]

[1]コードclassTypeExchange.h

おすすめ

転載: blog.csdn.net/thefist11cc/article/details/114208885