В языке 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>
#include <string>
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>
#include <string>
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
}