C++ smart pointers and classes
I dislike that your class mixes functionality (a mathematical vector) with memory management. A class should only do one of those. If I prefer shared_ptr I have to rewrite your whole Vector class.

There is actually a thing in C++ that is better than smart pointers, which is value semantics. People rarely screw up the lifetime management of an int, it just works naturally. When you do tricky lifetime management try to mimic the way int does it.

The operator + should be const (as well as GetX, GetY and GetZ). It should also work on Vectors and not only on pointers. The standard way to add Vectors is this:

Vector operator +(const Vector &amp;lhs, const Vector &amp;rhs){
    return Vector(lhs.GetX() + rhs.GetX(), lhs.GetY() + rhs.GetY(), lhs.GetZ() + rhs.GetZ());
}


Note that this is a free function, not a member function of Vector. Prefer free functions, because they work in more cases (like multiplying an int to a Vector) and are thus more consistent.

This allows you to do this:

Vector v1{ 1, 2, 3 };
Vector v2{ 6, 5, 4 };
auto v3 = v1 + v2;


Now, if you do want to support unique_ptr you can do so basically the same way:

std::unique_ptr&lt;Vector&gt; operator +(const std::unique_ptr&lt;Vector&gt; &amp;lhs,
    const std::unique_ptr&lt;Vector&gt; &amp;rhs){
    return std::make_unique&lt;Vector&gt;(*lhs + *rhs); //uses above operator
}


This allows you to do this:

auto v1 = std::make_unique&lt;Vector&gt;(1, 2, 3);
auto v2 = std::make_unique&lt;Vector&gt;(4, 5, 7);
auto v3 = v1 + v2;


All in all you seem to have a pretty good grip on operator overloading and smart pointers already.