 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
helmut.weil@t-online.de Guest
|
Posted: Wed May 03, 2006 11:16 am Post subject: Vegleichs-Operator global oder Klassenspezifisch |
|
|
Hallo,
kann mir mal jemand sagen, wieso man zwei unterschiedliche == -
Operatoren schreiben kann, die doch das Gleiche bewirken, gleichgültig
ob sie als global oder Klassenspezifisch deklariert sind ?
#define ZWEI
class C
{
int a, b;
public:
C():a(3), b(4) {}
C(int p):a(p), b(p) {}
#ifdef ZWEI
friend bool operator == (C a, C b);
#else
bool operator == (C c);
#endif
};
#ifdef ZWEI
bool operator == (C a, C b)
{
if(a.a == b.a)
return true;
return false;
}
#else
bool C::operator == (C c)
{
if(this->a == c.a)
return true;
return false;
}
#endif
void gleich_op()
{
int x;
C a, b;
if(a == b) x = 8;
else x = 3;
}
Die Funktion liefert in beiden Fällen (#define .....) das Gleiche
Danke
Helmut
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Thu May 04, 2006 9:25 am Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch |
|
|
helmut.weil@t-online.de wrote:
| Quote: | kann mir mal jemand sagen, wieso man zwei unterschiedliche ==
- Operatoren schreiben kann, die doch das Gleiche bewirken,
gleichgültig ob sie als global oder Klassenspezifisch
deklariert sind ?
|
Damit man einen oder den anderen verwenden kann, je nach dem,
was man will. Der Vorteil des Mitglieds ist, dass er auf allem
zugreifen kann, ohne dass er friend sein muss. Der Vorteil der
freien Funktion ist, dass implizierte Umwandlungen auch auf dem
rechten Parameter stattfinden kann.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Clemens Hintze Guest
|
Posted: Thu May 04, 2006 12:23 pm Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch |
|
|
On 3 May 2006 00:16:28 -0700
"helmut.weil@t-online.de" <helmut.weil@t-online.de> wrote:
Hallo,
| Quote: | kann mir mal jemand sagen, wieso man zwei unterschiedliche == -
Operatoren schreiben kann, die doch das Gleiche bewirken, gleichgültig
ob sie als global oder Klassenspezifisch deklariert sind ?
|
damit der Compiler eventuelle Konvertierungsmöglichkeiten finden und
nutzen kann. Bei Deinem Beispiel:
| Quote: |
#define ZWEI
class C
{
int a, b;
public:
C():a(3), b(4) {}
C(int p):a(p), b(p) {}
(...)
};
|
*muss* im Falle nicht ZWEI das Objekt auf der linken seite von '==' ein
C sein, um Deinen C::operator==() zu rufen. Also so:
C c1, c2;
c1 == c2; // OK
c1 == 12; // OK, da der Compiler c1 == C(12) daraus macht.
Wenn Du denn Operator hingegen als friend definierst (also Dein
Fall ZWEI), dann kann der Compiler auch dies:
12 == c1;
Weil er daraus ein C(12) == c1 macht! So etwas kann manches mal recht
nützlich sein. Insbesondere, wenn Du vielleicht verkettete Ausdrücke
hast. :-)
Ciao,
Clemens.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
helmut.weil@t-online.de Guest
|
Posted: Fri May 05, 2006 10:21 am Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch |
|
|
Voila !!!!
wieder was gelernt.
Danke
Helmut Weil
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Fri May 05, 2006 11:21 am Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch |
|
|
Clemens Hintze wrote:
| Quote: | On 3 May 2006 00:16:28 -0700
"helmut.weil@t-online.de" <helmut.weil@t-online.de> wrote:
kann mir mal jemand sagen, wieso man zwei unterschiedliche
== - Operatoren schreiben kann, die doch das Gleiche
bewirken, gleichgültig ob sie als global oder
Klassenspezifisch deklariert sind ?
damit der Compiler eventuelle Konvertierungsmöglichkeiten
finden und nutzen kann. Bei Deinem Beispiel:
#define ZWEI
class C
{
int a, b;
public:
C():a(3), b(4) {}
C(int p):a(p), b(p) {}
(...)
};
*muss* im Falle nicht ZWEI das Objekt auf der linken seite von
'==' ein C sein, um Deinen C::operator==() zu rufen.
|
Nicht ganz genau. Abgeleitete Klassen gehen auch. Ein neues
Objekt wird aber nicht als Ergebnis einer Umwandlung
eingerichtet; es muss also möglich sein, die Funktion direkt auf
dem vorhandenen Objekt aufzurufen.
In vielen Fällen spielt das keine Rolle. (Wenn z.B. alle
Constructoren explicit sind.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Clemens Hintze Guest
|
Posted: Mon May 08, 2006 10:33 am Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch |
|
|
On 5 May 2006 03:56:48 -0700
"kanze" <kanze@gabi-soft.fr> wrote:
(...)
| Quote: | *muss* im Falle nicht ZWEI das Objekt auf der linken seite von
'==' ein C sein, um Deinen C::operator==() zu rufen.
Nicht ganz genau. Abgeleitete Klassen gehen auch. Ein neues
Objekt wird aber nicht als Ergebnis einer Umwandlung
eingerichtet; es muss also möglich sein, die Funktion direkt auf
dem vorhandenen Objekt aufzurufen.
|
Okay, ich war nicht ganz eineindeutig. Wenn D->C dann gilt für mich
immer, dass D ein C *ist* (is-a). Aber Du hast recht, man hätte es auch
misverstehen können. Danke daher für die Klarstellung :-)
Ciao,
Clemens.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|