2017年10月29日
《その97》 ユーザ定義変換
ユーザ定義変換
ユーザ定義変換とは、変換コンストラクタ と 変換関数の総称です。
次のヘッダ boolean.h は、組込み型の bool型を模した クラス Boolean を定義しています。
このプログラムコードとコメント文によって、
◆ 変換コンストラクタ
◆ 変換関数
◆ ユーザ定義変換
を、説明してみました(理解できる説明になっていればいいのですが…)。
// boolean.h
#ifndef ___Class_Boolean
#define ___Class_Boolean
#include <iostream>
/* --- 組込み型の bool型を模した クラス Boolean --- */
class Boolean {
public:
enum boolean {False, True};
/*
↑
※ 列挙体 boolean
※ 列挙子 False, True の型は boolean型
( boolean型はクラス内部で定義した型で、組込み型のbool型とは無関係。)
※ 列挙子 False には整数値 0 が、列挙子 True には整数値 1 が割り振られる。
*/
private:
boolean v; // boolean型のデータメンバ v
public:
Boolean() : v(False) { } // デフォルトコンストラクタ(Falseで初期化)
Boolean(int val) : v(val == 0 ? False : True) { }
/*
↑
※ 変換コンストラクタ [★1] … 単一の引数で呼び出せるコンストラクタ。
( int型から boolean型に変換する。)
*/
operator int() const { return v; }
/*
↑
※ boolean型から int型への変換関数 [★2]
※ v は boolean型の列挙子 False または True
( False は整数値としては 0、True は整数値としては 1 である。)
*/
operator const char*() const { return v == False ? "False" : "True"; }
/*
↑
※ boolean型から 文字列 const char*型への変換関数
※ 文字列リテラル "False", "True" は静的記憶域期間を持つ。
( クラス内部の "False", "True" は、クラスの外でも有効な文字列リテラル。)
*/
};
inline std::ostream& operator<<(std::ostream& s, Boolean& x) {
return s << static_cast<const char*>(x);
}
/*
↑
※ 演算子関数 operator<<
※ ヘッダ内であってもクラス定義の外で定義された関数は外部結合
を持つため、inline を付けて内部結合を持たせる必要がある。
*/
#endif
/*
※ ユーザ定義変換 ・ ・ ・ 変換コンストラクタ と 変換関数の総称
( 変換コンストラクタ [★1] と 変換関数 [★2] が揃うと、
int型と boolean型の間で型変換が相互に可能になる。)
*/
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6910876
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック