Ключевым моментом в управлении взаимодействием различных частей в C++ программе является разграничение интерфейса компопонентов программы с их реализацией. На уровне языка, C++ представляет интерфейс в виде объявлений. Обяъвление указывает все необходимые части интерфейса, которые необходимы например для функции: возвращаемое значение, аргументы, имя функции. Например:
- double sqrt(double); // функция квадратного корня, которая принимает аргументы типа double и возвращает переменную типа double
- // Объявление класса со всеми необходимыми методами и участниками класса
- class Vector
- {
- public:
- Vector(int s);
- double& operator[](int i);
- int size();
- private:
- double∗ elem;
- int sz;
- };
Ключевым моментом здесь является то, что реализация всех методов и функций может находиться совершенно в другом месте, в другом файле. Зачастую объявление функций осуществляется в заголовочных файлах с расширением .h , а реализация осуществляется в файлах исходных кодов .cpp.
Например, реализация функции квадратного корня:
- double sqrt(double d) // definition of sqrt()
- {
- // ... алгоритм нахождения квадратного корня ...
- }
Также для класса Vector потребуется реализовать несколько участников:
- Vector::Vector(int s) // реализация конструктора
- : elem{new double[s]}, sz{s} // инициализация участников
- {
- }
- double& Vector::operator[](int i) // реализация оператора доступа
- {
- return elem[i];
- }
- int Vector::size() // реализация метод size()
- {
- return sz;
- }
Мы должны определить функции Vector, но не sqrt (), поскольку она является частью стандартной библиотеки. Однако это не имеет никакого значения: библиотека - это просто какой-то «другой код, который мы используем», написанный с теми же языковыми средствами, что и мы.