Правила программирования на Си и Си++

       

Правила программирования на Си и Си++

Не пользуйтесь функциями типа get/set (чтения и присваивания значений)
Откажитесь от выражений языка Си, когда программируете на Си++
Проектируйте с учетом наследования
Функция-член должна обычно использовать закрытые поля данных класса
Используйте константы

Используйте структуры только тогда, когда все данные открытые и нет функций-членов
Не размещайте тела функций в определениях классов
Избегайте перегрузки функций и аргументов, используемых по умолчанию
Избегайте дружественных классов
Наследование — это форма сцепления


Не портьте область глобальных имен: проблемы Си++

Никогда не используйте ссылки в качестве результатов, пользуйтесь указателями
Не возвращайте ссылки (или указатели) на локальные переменные
Не возвращайте ссылки на память, выделенную оператором new
Присваивание самому себе должно работать
Классы, имеющие члены-указатели
Исходите из того, что члены и базовые классы инициализируются в случайном порядке

Конструкторы копий должны использовать списки инициализации членов
Производные классы должны обычно определять конструктор копии и функцию operator=( )
Конструкторы, не предназначенные
Используйте счетчики экземпляров объектов для инициализации на уровне класса
Суперобложки на Си++ для существующих интерфейсов редко хорошо работают
Виртуальные функции — это те функции, которые вы не можете написать на уровне базового класса

Виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора
Не вызывайте чисто виртуальные функции из конструкторов
Деструкторы всегда должны быть виртуальными
Функции базового класса
Не делайте функцию виртуальной
Защищенные функции обычно должны быть виртуальными
Опасайтесь приведения типов (спорные вопросы Си++)
Не вызывайте конструкторов из операции operator=( )

Операция — это сокращение (без сюрпризов)
Используйте перегрузку операций
Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции
Перегруженные операции должны работать точно так же, как они работают в Си
Перегруженной бинарной операции
Если можно, то делайте все преобразования типов с помощью конструкторов
Используйте new/delete вместо malloc()/free()

Вся память, выделенная в конструкторе, должна быть освобождена в деструкторе
Локальные перегрузки операторов new и delete опасны
Используйте встроенные шаблоны функций вместо параметризированных макросов
Всегда знайте размер шаблона после его расширения
Шаблоны не заменяют наследование; они его автоматизируют
Назначение исключений — не быть пойманными

По возможности возбуждайте объекты типа error
Возбуждение исключений из конструктора ненадежно




Содержание раздела