Проблема использования общих функций и имен
В языке Си++ существует строгое правило, в соответствии с которым прежде чем использовать в программе имя или идентификатор, его необходимо определить. Рассмотрим для начала функции. Для того чтобы имя функции стало известно программе, его нужно либо объявить, либо определить.
Объявление функции состоит лишь из ее прототипа, т.е. имени, типа результата и списка аргументов. Объявление функции задает ее формат, но не определяет, как она выполняется. Примеры объявлений функций:
double sqrt(double x);// функция sqrt long fact(long x); // функция fact
// функция PrintBookAnnotation void PrintBookAnnotation(const Book book);
Определение функции – это определение того, как функция выполняется. Оно включает в себя тело функции, программу ее выполнения.
// функция вычисления факториала // целого положительного числа long fact(long x) { if (x == 1) return 1; else return x * fact(x - 1); }
Определение функции играет роль объявления ее имени, т.е. если в начале файла определена функция fact, в последующем тексте функций и классов ею можно пользоваться. Однако если в программе функция fact используется в нескольких файлах, такое построение программы уже не подходит. В программе должно быть только одно Определение функции.
Удобно было бы поместить Определение функции в отдельный файл, а в других файлах в начале помещать лишь объявление, прототип функции.
// начало файла main.cpp long fact(long); // прототип функции int main() { . . . int x10 = fact(10); // вызов функции . . . } // конец файла main.cpp // начало файла fact.cpp // определение функции // вычисления факториала целого // положительного числа // long fact(long x) { if (x == 1) return 1; else return x * fact(x - 1); } // конец файла fact. cpp
Компоновщик объединит оба файла в одну программу.
Аналогичная ситуация существует и для классов. Любой класс в языке Си++ состоит из двух частей: объявления и определения. В объявлении класса говорится, каков интерфейс класса, какие методы и атрибуты составляют объекты этого класса. Объявление класса состоит из ключевого слова class, за которым следует имя класса, список наследования и затем в фигурных скобках - методы и атрибуты класса. Заканчивается объявление класса точкой с запятой.