Это можно сделать, но не через перегрузку static_cast<>()
. Вы делаете это, перегружая оператор typecast:
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();
Не говоря уже о том, что обычно вы хотите иметь доступ к другой информации о Square
, например, GetSide()
или GetApothem()
или GetPerimeter()
или что-то еще. operator int()
очевидно может вернуть только один int
, и вы не можете иметь несколько operator int()
s в качестве членов класса.
Вот еще одна ситуация, когда operator int()
создает код, который компилируется, но не имеет никакого смысла:
Square s;
if(s > 42) {} // Huh?!
Что значит для Square
быть больше 42? Это нонсенс, но с operator int()
приведенный выше код будет компилироваться, так как Shape
теперь можно преобразовать в int
, который можно сравнить с другим int
со значением 4
.
Так что не пишите операторы Typecast. На самом деле, если вы перегружаете операторов typecast, вы можете дважды подумать о том, что вы делаете. На самом деле есть только несколько случаев, когда перегрузка оператора typecast полезна в современном C ++ (например, идиома безопасной bool ).