C++/Не злоупотребляйте операторами преобразования типов

Использование операторов преобразования типов частенько может приводить к потенциально ошибочному коду. Расписывая принципы ООП, в книжках часто приводят примерно такой код:

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.

Популярные страницы

C++/Оптимизация программ на языке C++

C++/Компиляторы

C++/Профайлеры

C++/Отладчики

Неблокируемые и асинхронные приложения

C++/Что предпочтительней: ссылка или указатель?

C++/Необычный код на C++

У вас есть полезные знания?

Тогда поделитесь ими с другими, добавив статью