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, double

    Wie 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.


  • Mod

    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.


  • Mod

    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).


Anmelden zum Antworten