c++ - Implementierung Freund/inline-Funktionen
Ich kann nicht scheinen, um herauszufinden, die Antwort auf diese newbie-Frage. Wenn ich eine Klasse
//Header-Datei (.h)
Class X {
public:
friend bool operator==(const X&, const X&);
inline size_type rows() const;
};
etc...
wenn ich gehe, Sie umzusetzen .cpp-Datei, die von X, sollte ich auch die Wörter, die inline - & Freund in die Funktion von Namen in der .cpp-Datei. dh sollte ich umsetzen meine Datei, die ähnlich der unten
//CPP file (.cpp)
#include "X.h"
friend bool operator==(const X&, const X&) {
//implementation goes here
//return true/false
}
inline size_type rows() const {
return r;
}
oder sollte ich nicht diese also mögen unter
#include "X.h"
bool operator==(const X&, const X&) { ... }
size_type rows() const { ... }
- Auf der member-Funktionen (anstatt der
friend
sind) siehst du den Typ in der definition:X::size_type X::rows() const {...}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das sollten Sie nicht, also die 2. version richtig ist.
friend
kann nur verwendet werden, innerhalb der definition einer Klasse (es hat keine Bedeutung außerhalb von ihm), und der compiler sucht die Funktion die Signatur zu finden, die definition derfriend
Funktion deklariert, die innerhalb Ihrer KlasseX
.inline
verwendet in header-Dateien (obwohl, ich denke, technisch ist es möglich es in einer cpp-Datei auch, nur macht es keinen Sinn gibt). Und beachten Sie, dassinline
macht nur Sinn, wenn Sie tatsächlich definieren die Funktion rechts gibt es - es kann keine Wirkung haben, wenn Sie die definition einer Funktion getrennt, in einer cpp-Datei.Den Punkt
inline
ist auf Hinweis der compiler, dass die Funktion in Frage stellen können eingebettet (es ist keine Garantie, aber der compiler ist frei, zu entscheiden, ob es inlines, die Funktion oder nicht). Wenn die Funktion inlined, alle Anrufe, um es ersetzt durch eine Kopie der Funktion Körper. Dies ist praktisch immer gemacht für performance-Vorteile, um die Kosten von Funktionsaufrufen, die auf Kosten der potentiell erhöhen Größe Programm. Nun, wenn wir wollen, dass die inline-Funktion ist, wollen wir es werden inline auf der ganzen Ort, nicht nur innerhalb einer einzigen compilation unit; dies ist der Grund, warum es wenig Sinn macht, verwenden Sie dieinline
Schlüsselwort innerhalb einer Implementierungsdatei.inline
. Eine Funktion deklariertinline
kann mehrmals in verschiedenen übersetzungen Einheiten und nicht die Ursache für duplizieren Fehler bei link-Zeit. Ich weiß nicht, ob dies ist standard Verhalten.inline
Spezifikation;inline
ist ein Hinweis nur. Wenn das passiert, können Sie auch mehrere Definitionen der gleichen Funktion in verschiedene übersetzungseinheiten. Der linker benötigt wird, nicht ablehnen, das Programm auf der Grundlage des eine-definition-Regel in einem solchen Fall exakte Duplikate, die sich ausinline
.inline
Richtlinie in der cpp-Datei. Und wie ich oben erklärt, wenn Sie nicht der definition (Implementierung) der Funktion in der header-Datei zusammen mit derinline
Richtlinie, wird es keine Wirkung haben. Also deine Funktion verhält sich wie ein normales nicht-inline-Funktion.inline
gemeint semantisch-Weise)Beim definieren
friend
Funktionen Sie können eine von zwei verschiedenen Optionen:Definieren die
friend
Funktion innerhalb der KlassendefinitionDefinieren Sie in den umschließenden namespace:
Aber beachten, dass es Unterschiede in Bezug auf lookup. Insbesondere der erste Fall ist restriktiver (und damit bevorzugt werden sollten), da nur ADL (Argument Dependent --aka Koening-- Lookup), wird es finden, während im zweiten Fall die Funktion berücksichtigt werden, wenn das namespace berücksichtigt.
Ist, für den compiler zu prüfen, die erste Funktion als eine überlast, das argument an der Stelle der Aufruf muss ein
test
wird, während im zweiten Fall erwogen werden, wenn die Kennung entspricht, und könnte betrachtet werden als eine gültige option, wenn das argument ist Cabrio zutest
.Nicht wollen, dass der Freund Präfix auf den Rumpf der Funktion, nur die Signatur in den header.