Правила программирования на С и С++. Главы 7-8 - Локальные перегрузки операторов new и delete опасны
Written on .
ОГЛАВЛЕНИЕ
- Правила программирования на С и С++. Главы 7-8
- Глава 7. Правила, относящиеся к языку С
- Подавляйте демонов запутанности (Часть 2)
- Избегайте битовых масок; используйте битовые поля
- Для битового поля размером 1 бит должен быть определен тип unsigned
- Указатели должны указывать на адрес, больший, чем базовый для массива
- Используйте указатели вместо индексов массива
- Избегайте goto, за исключением...
- Глава 8. Правила программирования на С++
- Глава 8.А. Вопросы проектирования и реализации
- Рассчитывайте потратить больше времени на проектирование и меньше на разработку
- Библиотеки классов С++ обычно не могут быть использованы неискушенными пользователями
- Пользуйтесь контрольными таблицами
- Сообщения должны выражать возможности, а не запрашивать (предлагать ?) информацию
- Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную
- Наследование - это процесс добавления полей данных и методов-членов
- 98. Сначала проектируйте объекты
- Затем проектируйте иерархию снизу вверх
- Возможности, определенные в базовом классе, должны использоваться всеми производными классами
- Инициализируйте виртуальные базовые классы при помощи конструктора, используемого по умолчанию
- Используйте закрытые базовые классы лишь когда вы должны обеспечить виртуальные замещения
- Проектируйте структуры данных в последнюю очередь
- Никогда не допускайте открытого доступа к закрытым данным
- Не пользуйтесь функциями типа get/set (чтения и присваивания значений)
- Откажитесь от выражений языка С, когда программируете на С++
- Проектируйте с учетом наследования
- Функция-член должна обычно использовать закрытые поля данных класса
- Используйте константы
- Используйте структуры только тогда, когда все данные открытые и нет функций-членов
- Не размещайте тела функций в определениях классов
- Избегайте перегрузки функций и аргументов, используемых по умолчанию
- Глава 8.Б. Проблемы сцепления
- Избегайте дружественных классов
- Наследование - это форма сцепления
- Не портьте область глобальных имен: проблемы С++
- Глава 8.В. Ссылки
- Не возвращайте ссылки (или указатели) на локальные переменные
- Не возвращайте ссылки на память, выделенную оператором new
- Глава 8.Г. Конструкторы, деструкторы и operator=( )
- Присваивание самому себе должно работать
- Классы, имеющие члены-указатели, должны всегда определять конструктор копии и функцию operator=()
- Исходите из того, что члены и базовые классы инициализируются в случайном порядке
- Конструкторы копий должны использовать списки инициализации членов
- Производные классы должны обычно определять конструктор копии и функцию operator=( )
- Конструкторы, не предназначенные для преобразования типов, должны иметь два или более аргумента
- Используйте счетчики экземпляров объектов для инициализации на уровне класса
- Избегайте инициализации в два приема
- Глава 8.Д. Виртуальные функции
- Виртуальные функции - это те функции, которые вы не можете написать на уровне базового класса
- Виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора
- Не вызывайте чисто виртуальные функции из конструкторов
- Деструкторы всегда должны быть виртуальными
- Функции базового класса, имеющие то же имя, что и функции производного класса, обычно должны быть виртуальными
- Не делайте функцию виртуальной, если вы не желаете, чтобы производный класс получил контроль над ней
- Защищенные функции обычно должны быть виртуальными
- Опасайтесь приведения типов (спорные вопросы С++)
- Не вызывайте конструкторов из операции operator=( )
- Глава 8.Е. Перегрузка операций
- Используйте перегрузку операций только для определения операций, имеющих аналог в С (без сюрпризов)
- Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции
- Перегруженные операции должны работать точно так же, как они работают в С
- Перегруженной бинарной операции лучше всего быть встроенным (inline) псевдонимом операции приведения типа
- Не сходите с ума с операторами преобразования типов
- Глава 8.Ж. Управление памятью
- Вся память, выделенная в конструкторе, должна быть освобождена в деструкторе
- Локальные перегрузки операторов new и delete опасны
- Глава 8.З. Шаблоны
- Используйте встроенные шаблоны функций вместо параметризированных макросов
- Всегда знайте размер шаблона после его расширения
- Шаблоны не заменяют наследование; они его автоматизируют
- Глава 8.И. Исключения
- По возможности возбуждайте объекты типа error
- Возбуждение исключений из конструктора ненадежно
- Заключение
- Все страницы
Страница 66 из 74
154. Локальные перегрузки операторов new и delete опасны.
Здесь основной проблемой является то, что операторы new и delete, определенные в виде членов класса, следуют другим правилам, чем перегруженные на глобальном уровне. Локальная перегрузка используется лишь тогда, когда вы размещаете единственный объект. Глобальная перегрузка используется вами всегда при размещении массива. Следовательно, этот код скорее всего не будет работать:
some_class *p = new some_class[1]; // вызывает глобальный оператор new() //...delete p; // вызывает some_class::operator delete()Помните, что эти две строки могут быть в различных файлах.