Похоже, вы спрашиваете об отделении определений от объявлений, хотя существуют и другие способы использования заголовочных файлов.
Ответ в том, что C ++ не «нуждается» в этом. Если вы пометите все как встроенное (что в любом случае является автоматическим для функций-членов, определенных в определении класса), разделение не требуется. Вы можете просто определить все в заголовочных файлах.
Причины, по которым вы можете хотеть отделиться:
- Чтобы улучшить время сборки.
- Для ссылки на код без источника определений.
- Чтобы не пометить все как «встроенные».
Если ваш более общий вопрос «почему C ++ не идентичен Java?», То я должен спросить: «Почему вы пишете C ++ вместо Java?» ; Р
Более серьезно, однако, причина в том, что компилятор C ++ не может просто обратиться к другому модулю перевода и выяснить, как использовать его символы так, как это делает и делает javac. Заголовочный файл необходим, чтобы объявить компилятору, что он может ожидать быть доступным во время ссылки.
Итак, #include
- это прямая текстовая замена. Если вы определяете все в заголовочных файлах, препроцессор в итоге создает огромную копию и вставку каждого исходного файла в вашем проекте и передает его в компилятор. Тот факт, что стандарт C ++ был ратифицирован в 1998 году, не имеет к этому никакого отношения, это тот факт, что среда компиляции для C ++ так тесно основана на среде C.
Преобразование моих комментариев для ответа на следующий вопрос:
Как компилятор находит файл .cpp с кодом в нем
Это не так, по крайней мере, во время компиляции кода, который использовал заголовочный файл. Функции, с которыми вы ссылаетесь, даже не нужно писать, не говоря уже о том, что компилятор знает, в каком файле .cpp
они будут находиться. Все, что нужно знать вызывающему коду во время компиляции, выражается в объявлении функции. , Во время соединения вы предоставите список .o
файлов, или статических, или динамических библиотек, а действующий заголовок обещает, что определения функций где-то там будут.