Не уверен, что я лентяй. Скорее Шилдт отстой.
Неа, отмазка не канает. Ограничиваться только одной книгой... А что насчёт Страуструпа? Всё-таки родитель С++. Кому как ни ему?
Если уж на то пошло, то самому разбраться? Совсем несложно.
Ладно, раз уж я сказал "А", буду говорить и "Б".
Итак, что такое преобразование типов? Т.н. cast? Это Вы знаете. Про перегрузку операторов тоже. Больше ничего не потребуется.
Оператор определяется ключевым словом и именем, которое по сути может быть любым. Компилятору только нужно его однозначно идентифицировать. По сути, оператор это ф-я. Например, можно определить след. равноправные по функциональности конструкции
CMyInt& operator+=(const CMyInt& mo)
{
m_nMyInt += mo.m_nMyInt;
return *this;
}
CMyInt& AddMyInt(const CMyInt& mo)
{
m_nMyInt += mo.m_nMyInt;
return *this;
}
и соответственно вызов
CMyInt mi(12);
CMyInt mi2(12);
mi+=mi2;
// или
mi.AddMyInt(mi2);
произведет одинаковые изменения объекта. Разница только в именах "ф-ций". Т.е. по идее можно было бы определить ф-ю и так
CMyInt& +=(const CMyInt& mo)
{
m_nMyInt += mo.m_nMyInt;
return *this;
}
и вызывать что-то типа
mi.+=(mi2);
Но к сожалению (или к счастью?) "+=" уже зарезервировано в С++. Ключевое слово operator позволяет "обойти" это ограничение и переопределить (точнее перегрузить, вспомните про перегрузку ф-ций) существующие функции.
Для переопределения типа, тоже можно создать ф-цию. Для примера выше, это могут быть
int CastToInt() { return m_nMyInt; }
double CastToDouble() { return (double)m_nMyInt; }
соответственно вызов
func2(mi.CastToInt());
func3(mi.CastToDouble());
Но в этом случае, необходимо явно указывать нужную ф-ю при каждом конкретном обращении к объекту. Конечно, можно обойтись и одной ф-ей, возвращающей только int
func3(mi.CastToInt());
но эти применимо только к числовым операциям. Например с CString это не будет работать
void func4(CString st) {}
...
func4(mi.CastToInt());
да и при неблагоприятном выборе ф-ции компилятор будет возмущаться (допустим мы сделели только CastToDouble).
func2(mi.CastToDouble()); // -> warning C4244: 'argument' : conversion from 'double' to 'int', possible loss of data
Вот тут и приходит на помощь оператор приведения типа. Итак, ф-я у нас выглядит след образом
int CastToInt() { return m_nMyInt; }
Т.е. вызывающий ожидает возвращаемый объектом тип int. Те над объектом совершается некоторя операция, результатом которой является значение целого типа. Это можно записать след образом
operator int() { return m_nMyInt; }
соответственно для double
operator double() { return (double)m_nMyInt; }
operator CString()
{
CString stRet;
stRet.Format(L"%d", m_nMyInt);
return stRet;
}
etc.
Теперь можно смело вызывать любую ф-ю
func1(mi);
func2(mi);
func3(mi);
func4(mi);
Аналогично оператор класса CBitmap возвращает сохранённый в нём HBITMAP. Вот и всё.
Удачи. И... учите матчасть.