Natürlich sind beide Definitionen nicht der beste Weg. Das ist jedoch nur am Rande relevant für deine Frage.
Die Antwort ist, dass du die erste Definition verwenden solltest, wenn die Methode sehr kurz ist und die Klassendefinition nicht überladen wird. Die erste Definition innerhalb der Klasse hat den Effekt, dass implizit ein inline
Schlüsselwort vor der Definition platziert wird.
Die zweite Definition kann auch in einer Headerdatei deklariert werden, und du kannst ein explizites inline
Schlüsselwort verwenden. Dies ist häufiger der Fall, wenn die Methode komplexer ist oder Teil einer Template-Spezifikation ist, bei der die vollständige Definition verfügbar sein muss, damit das Template ordnungsgemäß mit aktuellen Compilern instanziiert werden kann.
Also, hauptsächlich handelt es sich um eine Stilfrage, welche Art der Definition du verwendest. Wenn du jedoch die zweite Definition, die externe Deklarationsart der Klasse, verwendest und deine Methode in einer Headerdatei deklariert ist, sollte deine Methode explizit inline deklariert werden oder Mitglied einer Template-Klasse sein. Andernfalls könnte der Linker Warnungen vor doppelter Definition ausgeben.
Zuletzt, hier ist wie die Methode wirklich definiert werden sollte:
class Point {
Point(int x, int y) : x_(x), y_(y) { }
private:
const int x_;
const int y_;
};
Dies liegt daran, dass die Member const
sind. Sie müssen innerhalb der Konstruktor-Initialisierungsliste initialisiert werden, nicht im Konstruktor-Körper. In der Konstruktor-Body sind diese Zuweisungen illegal, weil die Member const
sind.
Es ist jedoch eine gute Angewohnheit, immer Initialisierungslisten zu verwenden, um die Member zu initialisieren, unabhängig davon, ob sie const
sind oder nicht. Dies liegt daran, dass wenn du Zuweisungen im Konstruktor-Körper verwendest, du den Standardkonstruktor für das Member aufrufst und dann etwas zuweisen musst. Dies ist wahrscheinlich aufwändiger, als es einfach mit dem richtigen Wert zu initialisieren, besonders wenn der Typ kein primitiver Typ ist.
Es hilft auch Fehler zu vermeiden, da deine Member immer initialisiert werden, anstatt dass ihre Initialisierung vom Kontrollfluss im Konstruktor-Körper abhängt.