だから、私は他の日に試験を持っていた、との質問の一つは、この非常によく似たものだった:static_castのオーバーロードはありますか?
私たちは、変数int side
を保持しているSquare
というクラスを持っています。 cout << static_cast<int>(aSquare) <<endl;
がaSquareの領域をプリントアウトすることは、どうすれば可能になりますか?
これは可能ですか?
だから、私は他の日に試験を持っていた、との質問の一つは、この非常によく似たものだった:static_castのオーバーロードはありますか?
私たちは、変数int side
を保持しているSquare
というクラスを持っています。 cout << static_cast<int>(aSquare) <<endl;
がaSquareの領域をプリントアウトすることは、どうすれば可能になりますか?
これは可能ですか?
これを行うことはできますが、オーバーロードを経由することはできません。static_cast<>()
あなたは、型キャスト演算子をオーバーロードによってそう:
class Square
{
public:
Square(int side) : side(side) {}
operator int() const { return side * side; } // overloaded typecast operator
private:
int side;
};
// ...
// Compiler calls Square::operator int() to convert aSquare into an int
cout << static_cast<int>(aSquare) <<endl;
がより頻繁に良いよりも害を行う傾向があるではないよりも、その過負荷に型キャスト演算子を注意してください。彼らは無意味な暗黙のキャスト操作を可能にします。以下のコードスニペットを読むと、「aはsの領域を得ようとしている」と思いますか?
Square aSquare;
int a = aSquare; // What the heck does this do?
私は確かにしません。これは、道より理にかなっているとはるかに読みやすいです:
Square aSquare;
int a = aSquare.GetArea();
通常、あなたがGetSide()
かGetApothem()
またはGetPerimeter()
または何のように、Square
に関するその他の情報にアクセスできるようにしたいことは言うまでもありません。 operator int()
は明らかにint
を1つだけ返すことができ、クラスのメンバーとして複数のoperator int()
を持つことはできません。
Square s;
if(s > 42) {} // Huh?!
それが42以上であることがSquare
にとって何を意味する:ここで
はoperator int()
はまだコンパイルするコードは全く意味をなさない作る別の状況は?それはナンセンスですが、operator int()
ではShape
がint
に変換され、int
の値は4
と比較されるため、上記のコードはコンパイルされます。
このような型キャスト演算子は記述しないでください。実際、型キャスト演算子をオーバーロードしている場合は、何をしているのかを二度考えてもよいでしょう。実際には、型キャスト演算子のオーバーロードが現代のC++で役に立ちます(例:the safe bool idiom)。
あなたは広場クラスの変換演算子を提供することができます:
struct square {
operator int() const {
return (side * side);
}
int side;
};
唯一の問題は、それが暗黙的に使用されることがあり、そしてdoesnのキャスト:
class Square
{
public:
operator int()
{
return side * side;
}
private:
int side;
};
側面ではなく領域を返します。 – Dani
非常に小さい正方形のインスタンスの場合に適用されます。 –
@ダニ:私はあなたがそのポイントを見逃していたと思います。私はOPがエリアを計算する方法を知っていると確信しています。質問は、質問の技術的な部分である正方形のオブジェクトからintを得る方法に正しく答えました。 –
あなたはキャスト演算子をオーバーロードすることができますここでは意味をなさない。あなたはキャストを使用する必要がある場合
struct square {
int get_area() const {
return (side * side);
}
int side;
}
は、Cを使用して:あなたはまた、キャストの異なる種類(static_castを、Cスタイルなど)
これは、物事を行うための好ましい方法で区別することはできません++ 11の機能を選択し、explicit
とマークします。これにより、暗黙のキャスト間違いが防止されます。
+1:Squareクラスはさらにいくつかのメソッドを使用できます。 'int GetSideLength()const'、' int GetPerimeter()const'、そして 'GetArea()'に名前付きメソッドを使わなければならないという曖昧さ回避のためです。 – rwong
精巧な答えをありがとう。 – Radix
@In silico:C++ 11では、変換演算子のためのキーワード 'explicit'をサポートしているので、安全なboolイディオムはもはや必要ありません。 – smerlin