Свойство “аддитивности” пространств имен означает, что одно и то же пространство имен может быть объявлено в нескольких местах в программе, и все эти объявления будут объединены компилятором в одно логическое пространство имен. Это позволяет определять и добавлять элементы в пространство имен в разных файлах или частях программы, что упрощает организацию кода.
Пример аддитивности пространств имен
- 
Первый файл // file1.cpp #include <iostream> namespace MyNamespace { void function1() { std::cout << "Function 1 from file1.cpp" << std::endl; } }
- 
Второй файл // file2.cpp #include <iostream> namespace MyNamespace { void function2() { std::cout << "Function 2 from file2.cpp" << std::endl; } }
- 
Главный файл // main.cpp #include "file1.cpp" #include "file2.cpp" int main() { MyNamespace::function1(); MyNamespace::function2(); return 0; }
Пример аддитивности с классами
Заголовочный файл
Методы классов должны быть объявлены в одном заголовочном файле, чтобы компилятор знал обо всех методах класса.
// myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
 
namespace MyNamespace {
    class MyClass {
    public:
        void method1();
        void method2();
    };
 
    void function1();
    void function2();
}
 
#endifИсходные файлы
// file1.cpp
#include "myclass.h"
#include <iostream>
 
void MyNamespace::MyClass::method1() {
    std::cout << "Method 1 from file1.cpp" << std::endl;
}
 
void MyNamespace::function1() {
    std::cout << "Function 1 from file1.cpp" << std::endl;
}
 
// file2.cpp
#include "myclass.h"
#include <iostream>
 
void MyNamespace::MyClass::method2() {
    std::cout << "Method 2 from file2.cpp" << std::endl;
}
 
void MyNamespace::function2() {
    std::cout << "Function 2 from file2.cpp" << std::endl;
}Главный файл
// main.cpp
#include "myclass.h"
 
int main() {
    MyNamespace::MyClass obj;
    obj.method1();
    obj.method2();
 
    MyNamespace::function1();
    MyNamespace::function2();
    return 0;
}Компиляция
g++ main.cpp file1.cpp file2.cpp -o my_programОбъяснение
- Единый заголовочный файл: Все методы класса MyClassобъявлены в одном заголовочном файлеmyclass.h, что позволяет компилятору видеть все методы класса при компиляции.
- Разделенные исходные файлы: Методы и функции определены в отдельных исходных файлах (file1.cppиfile2.cpp), что позволяет разделить логику и поддерживать аддитивность пространств имен.
Параметры по умолчанию
Параметры по умолчанию для методов должны быть объявлены в теле класса (в заголовочном файле), где они будут видны всем, кто подключает этот заголовочный файл с классом.