Seite 1 von 1

Basics Frage: C++ & Referenzen

Verfasst: 28. Februar 2007 15:12
von bloedi
Wieder eine ganz simple Frage, aber für mich ist es wichtig solche Grundlegende Sachen zu verstehen

Ich habe zwei Klassen QClassA und QClassB von QObject abgeleitet

die Klasse QClassB hat eine Function in public Bereich definiert in zwei Variaten 1. und 2.

1.

Code: Alles auswählen

QClassA QClassB:: myFunction(...)const{
...
}
2.

Code: Alles auswählen

QClassA & QClassB:: myFunction(...)const{
...
}
Fragen:
a) wann macht es sinn die Variante 2. zu benutzen?
b) mit der 2. Variante die Funktion liefert die Adresse von einem Objekt QClassA zurück??
c) Eine Referenz ist ein anderer Name für eine Variable??
d) wenn ich eine Referenz als Ausgabewert habe, dann wird kein ctor mehr aufgerufen?

Re: Basics Frage: C++ & Referenzen

Verfasst: 28. Februar 2007 15:49
von Christian81
bloedi hat geschrieben: a) wann macht es sinn die Variante 2. zu benutzen?
Wenn Du eine Referenz auf ClassA zurückgeben willst bzw. wenn Du die Klasse, die Du in ClassB gespeichert hast, ausserhalb von ClassB bearbeiten lassen willst
b) mit der 2. Variante die Funktion liefert die Adresse von einem Objekt QClassA zurück??
Nein, eine Referenz auf das ObjektA
c) Eine Referenz ist ein anderer Name für eine Variable??
Eine Referenz ist eine Refernz auf ein Objekt und keine Varaible im herköölichen Sinn.
d) wenn ich eine Referenz als Ausgabewert habe, dann wird kein ctor mehr aufgerufen?
Es wird keine neue Klasse erzeugt, also auch kein ctor aufgerufen.

Verfasst: 28. Februar 2007 16:37
von bloedi
zu Frage a) ich habe nicht verstanden

zu Frage b) also dann wie schreibe ich praktisch mein return?
SO???

Code: Alles auswählen

QClassA & QClassB:: myFunction(...)const{
 
QClassA * obj;
obj= new QClassA;
.......
return( obj &);// oder return(obj)??
}


Hast Du ein Link, wo die Differenzen zwischen Pointer und Referenzen erklärt sind?

Verfasst: 28. Februar 2007 17:41
von Christian81
bloedi hat geschrieben:zu Frage a) ich habe nicht verstanden
Wenn Du in der Funktion eine Referenz auf eine Member-Varaible zurückgibst, so kannst Du die Mmeber-Variable dann ausserhalb bearbeiten. Allerdings finde ich das unschön.
Da aber deine Funktion auch const ist, wird es wohl trotzdem nichts mit dem Bearbeiten.
QClassA & QClassB:: myFunction(...)const{

QClassA * obj;
obj= new QClassA;
.......
return( obj &);// oder return(obj)??
}
In diesem Falle kann man überhaupt keine Referenz zurückgeben.

QObject m_obj; // als Klassenvaraible

->
return m_obj;
Hast Du ein Link, wo die Differenzen zwischen Pointer und Referenzen erklärt sind?
Ich würde ein gutes C++ - Buch vorschlagen

Verfasst: 28. Februar 2007 17:52
von franzf
Christian81 hat geschrieben:Da aber deine Funktion auch const ist, wird es wohl trotzdem nichts mit dem Bearbeiten.
QClassA & QClassB:: myFunction(...) const{
[...]
}
In diesem Falle kann man überhaupt keine Referenz zurückgeben.
Ich war eigentlich bis jetzt sicher, dass ein const NACH dem Funktionsnamen besagt, dass diese Methode (hier: myFunction()) an dem Objekt, für das sie aufgerfufen wurde, nichts verändert.
z.B.: int QList::size () const
Wenn das const am Ende fehlt, spuckt der Compiler nen Fehler aus, wenn man sie auf ein const-Objekt anwenden will.

Eine "konstante (unveränderliche) Referenz" als Rückgabewert kennzeichnet man mit dem const VOR dem Typen des Rückgabewertes.
z.B.: const T & QList::first () const

Grüße
Franz

Verfasst: 28. Februar 2007 17:55
von Christian81
Ja Du hast vollkommen recht.
Nur sein Code erzeugt einen Pointer, dazu noch lokal - dort in irgend einer Art eine Referenz zurückzugeben (mit der man noch was anfangen kann), ist unmöglich.

Verfasst: 1. März 2007 08:00
von bloedi
Das habe ich zusammengestellt von einem C++ -Kurs, dass bei uns jährlich im Forschungszentrum angeboten wird . Der Dozent ist Dr. Mohr und ich vertraue 100%, was er sagt. Da seine Erklärungen so KLAR sind, wollte ich die auch weitergeben .
JETZT IST ALLES KLAR! Viel Spass, Carmen

C++ introduces a new type: reference types. A reference type (sometimes also called an alias) serves as an alternative name for the object with which it has been initialized.
- a reference type acts like a special kind of pointer. Differences to pointer types:
-a reference must be initialized (must always refer to some object, i.e., no null reference)
-no need to test against 0
- once initialized, it cannot changed
- syntax to access reference object is the same as for "normal" objects

Code: Alles auswählen

/* references */ 
int i = 5, val = 10; 
int &refVal = val; 
int &otherRef; //error! 
refVal++; //val/refVal now 11 
refVal = i; //val/refval now 5
refVal++; //val/refVal now 6 

Code: Alles auswählen

/* pointers */
 int i = 5, val = 10;
 int *ptrVal = &val;
 int *otherPtr; //OK
 (*ptrVal)++;
 ptrVal = &i; //val still 11
(*ptrVal)++; // i now 6!

- The primary use of a reference type is as an parameter type or return type of a function.
They are rarely used directly.
Passing an object by value (default), to or from a function, invokes copy constructor.
And a constructor call will be followed by a destructor invocation

Code: Alles auswählen

class Coord { ... double x, y, z; };
class Triangle { ... Coord v1, v2, v3; };
Triangle return_triangle (Triangle t) { return t; }
- Eight (copy) constructors and eight destructors called

-Solution: pass by reference (0 additional invocations)

Code: Alles auswählen

Triangle& return_triangle (const Triangle& t) { return t; }
-If possible, pass parameters by const reference to enable:
- processing of const objects
- automatic parameter conversions (non-const would change generated temporary only)

Recall: do not return references to:
- local objects
- object allocated in function from free store
=>when new object is needed, return it by value