В языке C++ можно разделять объявление и определение функций в том числе по отношению к функциям, которые создаются в классах. Для
этого используется выражение имя_класса::имя_функции(параметры) { тело_функции}
.
Например, возьмем следующий класс Person:
class Person { private: std::string name; unsigned age; public: Person(std::string p_name, unsigned p_age) { name = p_name; age = p_age; } void print() { std::cout << "Name: " << name << "\tAge: " << age << std::endl; } };
Разобъем класс, вынеся реализацию его методов во вне:
#include <iostream> class Person { private: std::string name; unsigned age; public: Person(std::string p_name, unsigned p_age); void print(); }; // конструктор Person::Person(std::string p_name, unsigned p_age) { name = p_name; age = p_age; } void Person::print() { std::cout << "Name: " << name << "\tAge: " << age << std::endl; } int main() { Person tom{"Tom", 38}; tom.print(); // Name: Tom Age: 22 }
Теперь функции класса Person (в данном случае конструктор и функция print) в самом классе имеют только объявления. Реализации функций размещены вне класса Person.
Консольный вывод программы:
Name: Tom Age: 38
Подобное разделение упрощает обзор и понимание интрефейса класса, особенно когда функции имеют много кода.
Три такой организации кода также можно делегировать конструктор:
#include <iostream> class Person { private: std::string name; unsigned age; public: Person(std::string p_name, unsigned p_age); Person(std::string p_name); void print(); }; // конструктор Person::Person(std::string p_name, unsigned p_age) { name = p_name; age = p_age; } // делегирование конструктора Person::Person(std::string p_name) : Person(p_name, 18) { } void Person::print() { std::cout << "Name: " << name << "\tAge: " << age << std::endl; } int main() { Person tom{"Tom", 39}; tom.print(); // Name: Tom Age: 39 Person bob{"Bob"}; bob.print(); // Name: Bob Age: 18 }