С++ Общая Информация ( Лысачёв П.С. ) (Лекция 1)
Primary tabs
Этапы сборки
Препроцессор -> Компилятор -> Линковщик
Стандартизация
когда пишите на си++ просьба соответствовать:
- Использовать отступы
- Один оператор – одна строка
- Короткие строчки
- Прописные макросы (#define UPPERCASE)
- Единое именование переменных и ф-ций:
- public: int time;
- int Time() const;
- private: int _time;
- Единый стиль.
Нет предупреждениям
Компиляция без предупреждений
Не отключать предупреждения:
- #pragma warning(push)
- #pragma warning(disable:4012)
- #pragma warning(pop)
Система контроля версий
- Visual Source Safe
- CVS
- SVN
Принципы
Make it run
Make it right
Make it fast
Оптимизация
Нет преждевременной оптимизации
Нет преждевременной пессимизации:
- 1) ++i; в место i++;
- 2) передача по ссылке, интеллектуальному указателю.
- 3) A::A(int i): _i(i) { } в место A::A(int i) { _i = i;}
Проектирование
- Один объект – одна задача
- Программа для человека, потом для машин
- Сокрытие информации (инкапсуляция)
- Минимизация глобальных данных(Singleton)
- Минимизация совместно используемых объектов
Кодирование
Время компиляции, компоновки вместо времени выполнения (темплейты вместо полиморфизма)
Часто использование dynamic_cast, static_cast – плохое проектирование
Использование const
Макросы
Нет макросам, только условная компиляция:
- 1) const и enum для констант
- 2) inline для встраиваемых функций
- 3) template для определения семейств функций и типов
- 4) namespace для избежания конфликтов имён
Кодирование 2
- Нет магическим числам в тексте: const int BIT_PER_PIXEL = 32;
- Объявление переменных как можно локальнее
- Нет неинициализированным переменным
- Нет длинным функциям и глубокой вложенности
#include 1
1) Правильно
// файл File.h #ifndef __FILE_H__ #define __FILE_H__ // содержимое File.h #endif
2) Неправильно
// файл File.cpp #ifndef __FILE_H__ #include “File.h” #define __FILE_H__ #endif
Операторы
Использовать префиксные в место постфиксных
Неперегружать &&, || и ,(запятая)
Нет кода, которые зависит от порядка вычислений аргументов ф-ии:
int c = 10; count(++c, ++c);
Классы
Минимальные классы вместо монолитных
Наследование
- Нет наследованию от классов, которые для этого не предназначены (контейнеры)
- Нет множественному наследованию (кроме наследования от множественных интерфейсов)
- Композиция в место наследования (где возможно):
class A{ B b;}; в место class A: public B {};
- Предпочтение абстрактных интерфейсов
Конструкторы
explicit на конструкторами с 1 аргументом:
class A { public: explicit A(int i); explicit A(const char* p, int n = 0); };
Копирование или разрешать или запрещать явно
Запрещать:
class A { private: A(const A&); A& operator = (const A&); };
Переменные
Объявление и инициализация в одном порядке
Виртуальные функции
- Не вызывать в конструкторах и деструкторах
- Виртуальные функции – защищённые
- Открытые функции – невиртуальные
Деструкторы
Всегда виртуальный кроме исключительных случаев
class A { public: virtual ~A(); };
Память
- Выделять и освобождать в одном модуле
- Выделять и освобождать в одном потоке
- new должен соответствовать delete
- new -> delete; new [] -> delete [];
Контейнеры
- По умолчанию использовать vector
- В место массивов использовать vector и string
- Хранить в контейнерах только значения или интеллектуальные указатели
- Предпочитать push_back в отличае от других способов расширения
- Уменьшать место занимаемое контейнером только через swap
Безопасность типов
- Избегать reinterpret_cast
- Избегать static_cast к указателям
- Избегать const_cast
- Избегать преобразований в стиле С
- Не используйте плавающие аргументы (…)
XP
- Планирование(planning)
- Тестирование(testing)
- Рефакторинг(refactoring)
- Простой дизайн(simple design)
- Постоянная интеграция(continuous integration)
- Частые выпуски версий(small releases)
- Стандарты кодирования(codings standarts)
- Log in to post comments
- 3676 reads