inline Point& Point::operator+ (Point& point)
{
return Point(x + point.x, y + point.y, z + point.z);
}
Это неверно, это возвращает ссылку на временный объект, который больше не существует, когда функция возвращается. Это приведет к сегфо, если вам повезет. Большинство компиляторов предупредит вас, если вы попытаетесь это сделать. В идеале вы должны написать этот оператор как свободную функцию, реализованную в терминах вашего члена operator+=
.
inline Point& Point::operator+= (Point& point)
{
x += point.x;
y += point.y;
z += point.z;
return *this;
}
Это довольно предпочтительный способ, за исключением того, что вы должны взять point
в качестве константной ссылки, иначе вы не сможете использовать его с временными. Возвращение ссылки на себя - это то, что позволяет связывать операторов. Обычно говорят, что если сомневаешься, делай как целые, а целые как это.
Подводя итог, можно сказать, что "каноническая" реализация будет:
inline Point& Point::operator+=( Point const& point )
{
x += point.x;
y += point.y;
z += point.z;
return *this;
}
inline Point const operator+( Point left, Point const& right )
{
return left += right;
}
Обратите внимание, что наличие operator+
свободной функции позволяет выполнять преобразования в Point
с обоими операндами, а не только с правильным. Он удобно реализован в терминах operator+=
: левый аргумент берется по значению, чтобы иметь временную копию, которую мы можем изменить, и мы делаем это, добавляя к ней правильный аргумент. Поскольку operator+=
возвращает ссылку, мы используем такой возврат, чтобы предоставить значение, которое будет скопировано как результат функции.