С++ Общая Информация ( Лысачёв П.С. ) (Лекция 1)

Этапы сборки

Препроцессор -> Компилятор -> Линковщик

Стандартизация

когда пишите на си++ просьба соответствовать:

  • Использовать отступы
  • Один оператор – одна строка
  • Короткие строчки
  • Прописные макросы (#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

  1. Нет магическим числам в тексте: const int BIT_PER_PIXEL = 32;
  2. Объявление переменных как можно локальнее
  3. Нет неинициализированным переменным
  4. Нет длинным функциям и глубокой вложенности

#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);

Классы
Минимальные классы вместо монолитных

Наследование

  1. Нет наследованию от классов, которые для этого не предназначены (контейнеры)
  2. Нет множественному наследованию (кроме наследования от множественных интерфейсов)
  3. Композиция в место наследования (где возможно):
    class A{ B b;}; в место class A: public B {};
  4. Предпочтение абстрактных интерфейсов

Конструкторы
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&);
	};

Переменные
Объявление и инициализация в одном порядке

Виртуальные функции

  1. Не вызывать в конструкторах и деструкторах
  2. Виртуальные функции – защищённые
  3. Открытые функции – невиртуальные

Деструкторы
Всегда виртуальный кроме исключительных случаев

	class A {
	public:
		virtual ~A();
	};

Память

  • Выделять и освобождать в одном модуле
  • Выделять и освобождать в одном потоке
  • new должен соответствовать delete
  • new -> delete; new [] -> delete [];

Контейнеры

  • По умолчанию использовать vector
  • В место массивов использовать vector и string
  • Хранить в контейнерах только значения или интеллектуальные указатели
  • Предпочитать push_back в отличае от других способов расширения
  • Уменьшать место занимаемое контейнером только через swap

Безопасность типов

  • Избегать reinterpret_cast
  • Избегать static_cast к указателям
  • Избегать const_cast
  • Избегать преобразований в стиле С
  • Не используйте плавающие аргументы (…)

XP

  1. Планирование(planning)
  2. Тестирование(testing)
  3. Рефакторинг(refactoring)
  4. Простой дизайн(simple design)
  5. Постоянная интеграция(continuous integration)
  6. Частые выпуски версий(small releases)
  7. Стандарты кодирования(codings standarts)