Funktionsdeklaration anders als Funktionsimplementierung mit Friend-Funktion
-
Hallo erstmal an alle,
ich bin neu hier, also bitte nicht hauen
Ich lerne gerade C++ mit dem Buch "C++ von A bis Z(2.Auflage)". Mir ist in Kapitel 4 bei der objektorientierten Programmierung aufgefallen das eine globale Funktionsdeklaration anders ist, als die Implementierung ueber die Friend-Funktion in einer Klasse.
// complex3.cpp #include <iostream> using namespace std; class myComplex { private: double _real; double _image; public: myComplex( double val1=0.0, double val2=0.0 ) { _real = val1; _image = val2; } void print_Complex( ) { cout << _real << "+" << _image << "\n"; } // Operator-Überladung als globale friend-Funktion [b]friend myComplex operator+([u] myComplex v1, myComplex v2[/u] );[/b] [b]friend myComplex operator+( [u]double v1, myComplex v2 [/u]);[/b] }; [b]myComplex operator+([u] myComplex val1, myComplex val2[/u] )[/b] { myComplex tmp; tmp._real = val1._real + val2._real; tmp._image = val1._image + val2._image; return tmp; } [b]myComplex operator+( [u]double val1, myComplex val2[/u] )[/b] { myComplex tmp; tmp._real = val1 + val2._real; tmp._image = val2._image; return tmp; } int main( void ) { myComplex val1(1.1, 2.2); myComplex sum; sum = 3.3 + val1; cout << "Wert von sum; "; sum.print_Complex( ); return 0; }
Ich hab gedacht die Parameter muessen immer gleich sein, ansonsten duerfte man ja nicht wissen welche Friend-funktion gemeint ist.
Oder reicht das hier aus das die Datentypen in der richtigen Reihenfolge sind wie bei dem Funktionsaufruf ?Gruss
THE-E
-
Die Parameternamen gehören nicht zur Funktionssignatur. Aus diesem Grund kann man bei einer Funktionsdeklaration andere Parameternamen als bei der Definition verwenden.
...
-
Namen sind Schall und Rauch. Du kannst die Parameternamen ändern wie du lustig bist - was zählt ist die Signatur der Funktion:
diese besteht aus: Typ des Rückgabewertes und den Typen aller Parameter.
In einem Fall also:
myComplex, myComplex, doubleWie du die Parameter dann nennst ist dir überlassen. Diese Namen sind nur eine Hilfe für den Programmierer und können in der Deklaration der Funktion sogar weggelassen werden:
friend myComplex operator+(double, myComplex);
-
Das ergibt Sinn. Danke fuer die schnellen Antworten.
-
Shade Of Mine schrieb:
was zählt ist die Signatur der Funktion:
diese besteht aus: Typ des Rückgabewertes und den Typen aller Parameter.
Wenn man es ganz genau nimmt, dann zählt der Rückgabewert in C++ nicht zur Signatur.
2 Funktionen, die sich nur durch ihren Rückgabewert unterscheiden, sind daher auch nicht erlaubt.
-
Außerdem gehört const-heit mit zur Signatur.
-
Jockelx schrieb:
Shade Of Mine schrieb:
was zählt ist die Signatur der Funktion:
diese besteht aus: Typ des Rückgabewertes und den Typen aller Parameter.
Wenn man es ganz genau nimmt, dann zählt der Rückgabewert in C++ nicht zur Signatur.
2 Funktionen, die sich nur durch ihren Rückgabewert unterscheiden, sind daher auch nicht erlaubt.Aber ein Zeiger vom Typ:
int()();
ist nicht konvertierbar auf einen Zeiger vom Typ
double()();zählt also doch dazu?
-
Ich habe lediglich auf die 'offizielle C++ Definition einer Signatur' hingewiesen, die den Rückgabewert nicht beinhaltet.
Ich verweise mal auf die hier im Forum durchweg als glaubwürdig eingestufte Referenz
Effektiv C++ Programmieren (letzter Absatz).
Wo das jetzt 'offiziell' nachzulesen ist, weis ich leider nicht.
-
ISO/IEC 14882:2003 schrieb:
1.3.10 signature [defns.signature]
the information about a function that participates in overload resolution (13.3): the types of its parameters and, if the function is a class member, the cv- qualifiers (if any) on the function itself and the class in which the member function is declared.2) The signature of a function template specialization includes the types of its template arguments (14.5.5.1).