トランプに関連するクラスを自作している時、奇妙に思える挙動に巡り合いました。
c++
1#include <iostream> 2#include <string> 3 4class Card { 5 private: 6 int suit; 7 public: 8 Card(int i) { suit = i; }; 9 Card(std::string);//入力された文字に対応した数字を代入します 10 int num() const { return suit + 1; }; 11 operator int() const { return suit; } 12 std::string str() const;//対応した文字列を返します 13 static Card numtocard(int i) { return Card(i - 1); } 14}; 15 16void func(Card card){}; 17 18int main(){ 19 int i = 4; 20 cout << ((Card)i).str();//5 21 cout << ((Card)"3").str();//3 22 func(i); 23}; 24
奇妙なことに、intからCard型への型変換を定義していないにも関わらず、intからCard型へのキャストができてしまっています。デバッグしてみると、(Card)i は Card(i) と同じように扱われています。さらには、暗黙的な型変換さえ行えてしまいます。
なぜこのような挙動が起きるのでしょうか。そう定義されているのですか?
このような挙動には問題があるように思えます。ユーザーが作成したクラスへの意図しないキャストが行われる可能性があり、バグの温床になるのではないでしょうか。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/27 04:49
2021/01/27 04:58
2021/01/27 05:10