Давайте; посчитаем вместе количество вызовов конструктора и деструктора.
В этом объявлении массива
Person arr[2] = {
Person(18,180),
Person(20,173)
};
конструктор вызывается два раза, потому что два объекта класса создается Здесь происходит исключение вызовов конструктора копирования.
В этом вызове
arr[0]+arr[1];
используется следующая функция
void Person::operator+(Person a) {
Person result;
result.age = (*this).age + a.age;
result.height = (*this).height + a.height;
cout << result.age << endl;
cout << result.height << endl;
}
Аргумент arr [ 1] передается функции по значению, вызывающему неявно определенный конструктор копирования. Таким образом, создается третий объект класса.
Внутри функции в этом объявлении создан четвертый объект
Person result;
Итак, четыре объекта были созданы, три из них с использованием конструктора с параметрами и один с конструктором копирования. В результате были также вызваны четыре деструктора.
Оператор должен быть объявлен и определен, по крайней мере, как
Person Person::operator +( const Person &a) const {
return Person( age + a.age, height + a.height );
}
С другой стороны, лучше сделать конструктор явным. Например
explicit Person(int age=20,int height=180) : age( age ), height( height )
{
}