Nixwisser wrote:
>>Das ist aber reines theoretisches Geplänkel. In der Praxis läuft es aufs
>>geliche hinaus und der Compiler wird auch in beiden Fällen identischen
>>Code erzeugen. Interessant ist dieser Unterschied nur dann, wenn
>>anstelle eines int tatsächlich mal ein 'richtiges' Objekt erzeugt werden
>>muss.
>
> Kannst du da mal ein Beispiel nennen?
Klar
Wir brauchen dazu eine Klasse mit einem Konstruktor, der einen oder
mehrere Werte übernimmt.
1 | class Fractional
|
2 | {
|
3 | public:
|
4 | Fractional( int Nominator, int Denominator )
|
5 | : nomi_( Nominator ),
|
6 | denomi_( Denominator )
|
7 | {}
|
8 |
|
9 | private:
|
10 | int nomi_;
|
11 | int denomi_;
|
12 | };
|
und natürlich soll diese Klasse auch was machen. Sagen wir mal, wir
verpassen ihr eine Funktion, die es ihr erlaubt, sich auf einen Stream
auszugeben. Dazu noch einen freistehenden op<< der uns erlaubt, diese
Funktion in gewohnter Syntax zu benutzen.
1 | class Fractional
|
2 | {
|
3 | public:
|
4 | Fractional( int Nominator, int Denominator )
|
5 | : nomi_( Nominator ),
|
6 | denomi_( Denominator )
|
7 | {}
|
8 |
|
9 | void output( ostream& out ) const { out << ((double)nomi_) / denomi_; }
|
10 |
|
11 | private:
|
12 | int nomi_;
|
13 | int denomi_;
|
14 | };
|
15 |
|
16 | std::ostream& operator<<( ostream& out, const Fractional& obj )
|
17 | {
|
18 | obj.output( out );
|
19 | return out;
|
20 | }
|
und jetzt möchten wir gerne die beiden Zahlen 5 und 8 als Bruch
auffassen (dazu ist ja die Klasse Fractional gedacht) und den Wert des
Bruchs in Zahlenform ausgeben
1 | int main()
|
2 | {
|
3 | std::cout << Fractional( 5, 8 ) << endl;
|
4 | }
|
Hier wird ein temporäres Fractional Objekt erzeugt, mit den Werten 5 und
8 initialisiert. Dieses temporäre Fractional Objekt wird aufgefordert
sich auf den Stream auszugeben (wobei op<< benutzt wird) und dann
zerstört sich das temporäre Objekt wieder.
Edit: Ach ja. Hier muss man über ein temporäre Objekt gehen. Mit simplen
Casting kommt man hier nicht weiter.