First: the two different ways are really "overload as a member" and "overload as a non-member", and the latter has two different ways to write it (as-friend-inside class definition and outside class definition).  Calling them "inside class" and "outside class" is going to confuse you.
Overloads for +=, +, -=, -, etc. have a special pattern:
struct Vector2 {
  float x, y;
  Vector2& operator+=(Vector2 const& other) {
    x += other.x;
    y += other.y;
    return *this;
  }
  Vector2& operator-=(Vector2 const& other) {
    x -= other.x;
    y -= other.y;
    return *this;
  }
};
Vector2 operator+(Vector2 a, Vector2 const& b) {
  // note 'a' is passed by value and thus copied
  a += b;
  return a;
}
Vector2 operator-(Vector2 a, Vector2 const& b) { return a -= b; } // compact
This pattern allows the conversions mentioned in the other answers for the LHS argument while simplifying the implementation considerably.  (Either member or non-member allows conversions for the RHS when it's passed either as a const& or by value, as it should be.)  Of course, this only applies when you do actually want to overload both += and +, -= and -, etc., but that is still common.
Additionally, you sometimes want to declare your non-member op+, etc. as friends within the class definition using the Barton-Nackman trick, because due to quirks of templates and overloading, it may not be found otherwise.