C ++クラスの自動変換と強制型置換
0X00まえがき
C ++では、クラスの設計は非常に重要です。クラス設計の品質は、そのインターフェイスが優れているかどうか、つまり関数の設計に依存します。
クラスのポリモーフィズムを強化するために、さまざまなインターフェイスを設計する必要がある場合があります。
今日は変革の問題についてお話します
その前に、クラスを私たちのように定義しましょう
class Dog
{
private:
int GoOutTimes; //表示一周遛狗的次数
double Kilo; //表示一周遛狗走的公里数
double Time; //表示一周遛狗的时间
public:
Dog(double ti); //构造函数:初始化遛狗时间
Dog(int times,double ki); //构造函数:初始化遛狗次数与遛狗距离
Dog(); //默认构造函数
~Dog(); //析构函数
void show_Ki() const; //展示公里数
void show_ti() const; //展示时间
};
0X10初期化中の自動変換
1.コンストラクターの暗黙的な変換の使用
ご覧のとおり、上記のクラスは3つのコンストラクターを提供します。
Dog(double ti);
Dog(int times,double ki);
Dog();
コンストラクターを呼び出して、クラスオブジェクトを宣言するときに初期化できます。
Dog Chichi(12.6);
Dog Mimi(3,10.2);
Dog Lolo();
Dogオブジェクトは犬の毎週の外出状況(日、キロメートル、時間)を表すため、整数または浮動小数点数をDogオブジェクトに変換する方法をいくつか提供できますか?
対応するコンストラクターがある
Dog(double ti);
ので、コンストラクターを使用してdouble型をDog型に変換できます。変じゃない?
しかしそれは機能します
Dog myDog;
myDog=14.3;
プログラムが実行されるmyDog=14.3;
と、コンパイラはコンストラクタが存在するかどうかを確認します。Dog(double)
このコンストラクタが存在するDog(double)
ため、を使用して作成します。一時的オブジェクトをドッグし、一時的な割り当てのメンバーを1つずつ採用して、オブジェクトをmyDogにコピーします。このプロセスは自動的に行われるため、暗黙的な変換と呼ばれます。
私たちが特別な注意を払う必要がある1つのこと
変換関数として使用できるのは、1つのパラメーターを受け入れるコンストラクターのみです。
このDog(int times,double ki);
関数は、2番目の引数のデフォルト値を提供できない限り、変換には使用されません。
Dog(int times,double ki=8.9);
そうして初めて、ユーザーはintを変換できます
2.明示的な制限の下で明示的
しかし、安全を確保するために、この危険な行動が起こらないようにする必要がある場合があります。(矛盾しているように聞こえますが、これはまさに言語設計者が考慮する必要があることです)
言い換えれば、この暗黙の変換をオフにします
したがって、explicit
その変更の下での(明示的な)修飾子の導入は、変更された関数の場合、そのような暗黙の変換が機能しないことを示しています。
explicit Dog(double ti);
現時点では、上記の暗黙的な変換は機能しませんが、明示的な変換を使用して変換を強制することができます。
Dog myDog;
//error
myDog = 13.2
//right
myDog = Dog(13.2);
myDog = (Dog) 13.2;
3.まとめ
要約
するとexplicit
、キーワードのDog (double)
使用は明示的にキャストするためにのみ使用
できます。それ以外の場合は、次の暗黙的な変換にも使用できます。
-
Dogオブジェクトをdouble値に初期化する場合
-
Dogオブジェクトにdouble値を渡す場合
-
Dogパラメーターを受け入れる関数にdouble値を渡す場合
-
戻り値がDogの関数として宣言され、double値を返そうとした場合
-
上記のいずれの場合でも、double型に変換できる組み込み型を使用する場合
おそらく最後の点は誰にとっても明らかではありません。
例を挙げて、最上位のクラスを取り上げます。Dog(double ti);
コンストラクターがあります。誰もが知っていることですが、Dogでは二重変換タイプが可能です。
Dog myDog;
myDog = 14.5;
ただし、次のコードも可能です。
Dog myDog;
myDog = 14;
実際、int(14)型はdouble(14.0)型に変換できるため、非常に理解しやすく、これは合法です。
ただし、次の点にも特に注意する必要があります。あいまいさ
どういう意味ですか?
そのような関数がある場合、犬のクラスDog(long)
はmyDog=14
変換が無効になります!
intはdoubleまたはlongに変換できるため、コンパイラーを困難にするあいまいさの問題があります。
その後、コンパイラが攻撃します。
0X11カスタム変換機能
対応するコンストラクターがあれば、基本型(doubleなど)をクラスオブジェクトに変換できることを前述しました。
では、クラスオブジェクトを直接基本型に変換できますか?(これも非常に奇妙なアイデアのように聞こえます)、次のようになります。
Dog Nana(7.6);
double Time=Nana;
答えはイエスです!
ただし、現時点で必要なのはコンストラクターではなく、特別な演算子関数です-変換機能
では、変換関数を作成するにはどうすればよいですか?
typeNameタイプに変換する場合、この形式の変換関数を使用する必要があり
operator ypename ()
ます。次の点に注意してください。
-
変換関数はクラスメソッドである必要があります。
-
変換関数は戻り値の型を指定できません。
-
変換関数にパラメーターを含めることはできません。
ここで、Dogオブジェクトをint型とdouble型に変換する関数をクラス宣言に追加します。
class Dog
{
private:
int GoOutTimes; //表示一周遛狗的次数
double Kilo; //表示一周遛狗走的公里数
double Time; //表示一周遛狗的时间
public:
Dog(double ti); //构造函数:初始化遛狗时间
Dog(int times,double ki); //构造函数:初始化遛狗次数与遛狗距离
Dog(); //默认构造函数
~Dog(); //析构函数
void show_Ki() const; //展示公里数
void show_ti() const; //展示时间
operator int() const; //转换为 int
operator double() const; //转换为 double
関数の実装内容は、自分で指定できます。
//将遛狗天数返回加1
Dog::operator int() const
{
return GoOutTimes+1;
}
//返回一周遛狗平均公里数
Dog::operator double() const
{
return Kilo/7;
}
0X20あとがき
クラスのポリモーフィズムを拡張するために、C ++はクラスを設計するための多くのメソッドを提供します。それらをうまく使用できれば、コーディング作業に非常に役立ちます。
今日のコンテンツが皆様のお役に立てば幸いです〜
どうもありがとうございました〜
また明日ね!
—————————————————————————————————————————————————— ————
リファレンス:「C ++ Primer Plus6thEdition」