Ви, здається, запитуєте про відокремлення визначень від декларацій, хоча для файлів заголовків є й інші способи використання.
Відповідь полягає в тому, що C ++ цього не потребує. Якщо ви позначаєте все вбудоване (що все одно є автоматичним для функцій-членів, визначених у визначенні класу), то в розділенні немає потреби. Ви можете просто визначити все у файлах заголовка.
Причини, від яких ви хочете відокремитись:
- Щоб покращити час збирання.
- Пов’язати проти коду, не маючи джерела для визначень.
- Щоб уникнути маркування всього "встроєного".
Якщо ваше більш загальне питання: "чому C ++ не є тотожним Java?", То я повинен запитати: "чому ви пишете C ++ замість Java?" ;-p
Більш серйозно, однак, причина полягає в тому, що компілятор C ++ не може просто проникнути в інший блок перекладу і придумати, як використовувати його символи таким чином, як javac може і робить. Файл заголовка необхідний, щоб оголосити компілятору те, що він може очікувати, що він буде доступний під час посилання.
Так #include
це пряма текстова підміна. Якщо ви визначаєте все у заголовкових файлах, препроцесор в кінцевому підсумку створює величезну копію та вставлення кожного вихідного файлу у вашому проекті та подає його до компілятора. Те, що стандарт C ++ був ратифікований у 1998 році, нічого спільного з цим не має, це той факт, що середовище компіляції для C ++ базується настільки тісно, що й для C.
Перетворення моїх коментарів, щоб відповісти на ваше подальше запитання:
Як компілятор знаходить .cpp-файл із кодом у ньому
Це не принаймні під час компіляції коду, який використовував файл заголовка. Функції, з якими ви пов'язуєтесь, навіть не потрібно писати ще, незважаючи на те, що компілятор знає, в якому .cpp
файлі вони будуть знаходитись. Все, що повинен знати код виклику під час компіляції, виражається в декларації функції. Під час посилання ви надасте список .o
файлів або статичних або динамічних бібліотек, а заголовок, по суті, є обіцянкою, що визначення функцій будуть десь там.