Использование операторов преобразования типов частенько может приводить к потенциально ошибочному коду. Расписывая принципы ООП, в книжках часто приводят примерно такой код:
class MyInt {
...
operator int() const;
}
В данном случае тип MyInt, если судить по имени, предназначен для эмуляции встроенного типа int. Поэтому оператор преобразования допустим и возможно полезен. Но если имя и предназначение класса другое, создавать операторы преобразования не следует. Значительно лучше сделать отдельные методы toInt(), toString() и т.п.
Вот пример неприятной ситуации, встреченной в одном проекте:
class Foo {
public:
char buff[128];
int a;
double c;
...
const char *operator() const {
return buff;
}
}
void useString(const char *s);
Foo *foo = new Foo;
...
useString( (const char *)foo ); // пытаемся вызвать оператор преобразования типа
В этом случае, неожиданно, все работает. Потому, что указатель указывает на объект foo, т.е. на первый элемент в buff. Однако стоит переместить buff чуть ниже и в качестве строки уже будет использована переменная a. Поэтому использовать метод c_str() или toString(), предпочтительней. Ну и конечно же не следует использовать приведение типов в стиле C.