Александреску Андрей
Шрифт:
В С++ последовательность преобразований типов может включать не более одного пользовательского преобразования. Однако когда в эту последовательность добавляются встроенные преобразования, ситуация может оказаться предельно запутанной. Решение здесь простое и состоит в следующем.
• По умолчанию используйте explicit в конструкторах с одним аргументом (см. рекомендацию 54):
• Используйте для преобразований типов именованные функции, а не соответствующие операторы:
См. также обсуждение копирующих конструкторов, объявленных как
Пример 1. Перегрузка. Пусть у нас есть, например,
Пример 2. Работающие ошибки. Допустим, вы снабдили класс
В результате этого становятся компилируемыми масса глупостей и опечаток. Пусть
Именно по этой причине в стандартном классе
При нечастом и осторожном использовании неявные преобразования типов могут сделать код более коротким и интуитивно более понятным. Стандартный класс
• Не имеется автоматического преобразования
• Все операторы сравнений, определенные для
Но и при этом возникают определенные неприятности, связанные с перегрузкой функций.
Этот результат для некоторых может оказаться сюрпризом. (Кстати, если бы выполнялся вызов
[Dewhurst03] §36-37 • [Lakos96] §9.3.1 • [Meyers96] §5 • [Murray93] §2.4 • [Sutter00] §6, §20, §39
41. Делайте данные-члены закрытыми (кроме случая агрегатов в стиле структур С)
Данные-члены должны быть закрыты. Только в случае простейших типов в стиле структур языка С, объединяющих в единое целое набор значений, не претендующих на инкапсуляцию и не обеспечивающих поведение, делайте все данные-члены открытыми. Избегайте смешивания открытых и закрытых данных, что практически всегда говорит о бестолковом дизайне.