PDA

Visualizza la versione completa : [c++]Overloading degli operatori?!?!??!


lucasp
15-06-2002, 16:15
Io so come funzia l' Overloading delle funzioni ma, onestamente, nn ho ancora capito Overloading degli operatori:cry:

Qualcuno è cosi gentile e pio da spiegarmelo?????

Ringrazio anticipatamente chiunque mi sappia aiutare;)

P.S: se annettete degli esempi(anche banali ma ben COMMENTATI) nn sarebbe male;)

r0x
15-06-2002, 16:26
E che c'è da capire? Sono esattamente la stessa cosa! :) Solo che invece di chiamare una funzione 'somma' la chiami 'operator+', nient'altro!

Ciao.

lucasp
15-06-2002, 16:29
Originariamente inviato da r0x
E che c'è da capire? Sono esattamente la stessa cosa! :) Solo che invece di chiamare una funzione 'somma' la chiami 'operator+', nient'altro!

Ciao.

potresti farmi un esempiodi codice ben commentato cosi capisco meglio?

r0x
15-06-2002, 16:57
Solito esempio stupido:



#include <iostream.h>

class ClasseStupida
{
public:
ClasseStupida()
{
membro = 100;
}

int somma( int addendo )
{
return membro + addendo;
}
int operator+( int addendo )
{
return membro + addendo;
}

private:
int membro;
};

void main()
{
ClasseStupida numero;
int addendo = 10;

cout << numero.operator+( addendo ) << endl;
cout << ( numero + addendo ) << endl; // forma infissa equivalente a quella sopra

cout << numero.somma( addendo ) << endl;
}


I due metodi, come avrai visto, si equivalgono in tutto, a parte per la scelta della forma infissa che solo l'operatore offre. Tieni conto solo di una cosa: almeno un parametro della funzione operatore deve essere un tipo di classe. In questo caso c'è il parametro sottinteso 'this'.

N.B.: nell'esempio l'operatore è un membro di classe, ma non lo deve essere per forza, può anche essere una funzione globale.

Ciao.

lucasp
15-06-2002, 17:01
Originariamente inviato da r0x
Solito esempio stupido:



#include <iostream.h>

class ClasseStupida
{
public:
ClasseStupida()
{
membro = 100;
}

int somma( int addendo )
{
return membro + addendo;
}
int operator+( int addendo )
{
return membro + addendo;
}

private:
int membro;
};

void main()
{
ClasseStupida numero;
int addendo = 10;

cout << numero.operator+( addendo ) << endl;
cout << ( numero + addendo ) << endl; // forma infissa equivalente a quella sopra

cout << numero.somma( addendo ) << endl;
}


I due metodi, come avrai visto, si equivalgono in tutto, a parte per la scelta della forma infissa che solo l'operatore offre. Tieni conto solo di una cosa: almeno un parametro della funzione operatore deve essere un tipo di classe. In questo caso c'è il parametro sottinteso 'this'.

Ciao.

ora ho capito, tnk
Ma è meglio usare l'overloading di operatori o di funzioni ???
E in quale ambito usarle?????

P.S: sei mai stato qui (http://www.hostsearch.it/newsgroup/thread.php?group=it.comp.lang.c%2B%2B)???????

r0x
15-06-2002, 17:18
Ma è meglio usare l'overloading di operatori o di funzioni ???
E in quale ambito usarle?????


Questione di comodità!

Quanto al newsgroup .. ma il thread che propone di sostituire il C++ con il C è ironico o cosa? :D

Ciao.

lucasp
15-06-2002, 17:23
>Questione di comodità!

qiundi è indifferente usare uno o l'altro, giusto????

>Quanto al newsgroup .. ma il thread che propone di sostituire il C++ con il C è ironico o cosa? :D

Secondo me è pazzo, ma gli hai risposto?????

P.S: lo sapevi che esisteva il newsgrup?

r0x
15-06-2002, 17:28
1) Sì, fondamentalmente è uguale, ma normalmente usare un operatore (nei casi opportuni) rende il codice più leggibile.

2) Probabilmente scherza.

3) Sì diciamo che di nome lo conoscevo.

Ciao.

lucasp
15-06-2002, 17:33
ho capito i Template (http://www.hostsearch.it/newsgroup/article.php?id=61039&group=it.comp.lang.c%2B%2B)!!!!!!

P.S:guarda che ho trovato (http://david.tribble.com/text/cdiffs.htm)

r0x
15-06-2002, 17:36
#include <iostream>
#include <string>

template<class T>
T max(T arg1, T arg2){
if (arg1 >= arg2)
return arg1;
else
return arg2;
}

int main(){
std::cout << max(5, 3) << std::endl;
std::cout << max(5.6, 3.2) << std::endl;
std::cout << max(std::string("a"), std::string("b")) << std::endl;
return 0;
}


Mi raccomando, fai attenzione alle due stringhe "a" e "b": non sono 'char*' ma oggetti 'string' (STL).



Nota che in questo semplice caso il compilatore
capisce da solo di che tipo sono gli argomenti, in casi ambigui devi
specificarlo tu.


E' quando ti parlavo delle chiamate con argomento implicito o esplicito (swap() e swap< int >() ad esempio).

Ultima cosa: il modo per overloadare una funzione template te l'ho illustrato nell'altro thread, può servire. :adhone:

Ciao.

Loading