Zuerst mal zu der Rückgabe-Thematik:
http://www.mistybeach.com/articles/WhyID…geProjects.html
Hat glaub ich hier mal jemand geposted (oder woanders?).
Hier wird die Problematik erklärt ;).
Auch zu empfehlen sind "Effective C++" und gibt diverse Seiten im Internet zu den typischen Stolperfallen in C++ (und ich schnappe nach Jahren auch oft noch welche auf, besonders wenn ich zwischenzeitlich Java o.ä. programmiere)
Hier wird der Speicher automatisch freigegeben, wenn der Scope verlassen wird?
Ja.
Auf Methoden greift man hier mit . zu?
Ja.
Hier wird der Speicher nicht automatisch freigegeben, sondern mit delete?
Ja.
Auf Methoden greift man hier mit -> zu?
Ja.
Welche der beiden Möglichkeiten verwendet man üblicherweise?
Kommt auf den Anwendungsfall an.
In moderneren Programmen (als embedded systems typ hab ich sowas leider meistens nicht) verwendet man statt der manuellen new-delete Variante üblicherweise Smart-Pointer (siehe zb. boost), die sich selbst um den Speicher kümmern. Einen simplen Reference Counting Pointer kann man sich auch relativ leicht selber schreiben (glaub hab noch irgendwo eine Implementierung von mir rumgammeln wenns dich interessiert, aber findet man sicher auch haufenweise im Internet).
Insofern sollte man auch immer die Destruktor Thematik beachten.
Auf der positiven Seite ist die Kontrolle über die Speicherfreigabe auch ein nützliches Tool. Klassisches Beispiel Semaphor (boost: scoped_lock) der beim Anlegen automatisch gelockt wird und bei Ende des Blocks wieder freigegeben (grad wenn man exceptions oder so verwendet..)
Und wie sieht das aus, wenn ich in einer Klasse als Eigenschaft ein Objekt einer anderen Klasse habe, also in Java etwa so:
Siehe den Link am Anfang.
Aber kommt auch auf den Anwendungsfall an..
Du kannst auch eine Referenz zurückgeben:
ClassA a;
ClassA& methodA( ) { return a; }
Oder zb. einen Pointer so:
ClassA* methodA() { return &a; }
Grad beim Pointer muss man sich halt auch immer überlegen, was der "draussere" damit anfängt.. bzw. dieser muss wissen, ob er das Ding freigeben muss oder nicht (könnte ja auch ein return new ClassA(); in der Methode sein).
Die erste Variante die du geposted hast liefert übrigens eine Kopie (siehe dazu Copy Constructor und operator=... *seufz*).
Bei gewissen Klassen (zb. kleinen Data-Holdern) auch eine sichere Alternative.
Übergabe von Objekten als Parameter an Funktionen
Welche von beiden Möglichkeiten verwendet man "im Normalfall"?
Bei zweiterem wird ein Pointer übergeben.
Eine Referenz würdest so übergeben:
public int doSomething(ClassA& objA) { ... }
ClassA objA;
doSomething(objA);
Und wieder sind im Prinzip alle Möglichkeiten offen (inklusive smart-pointer).
Kleine Datenobjekte wie strings etc. kannst kopieren, dann kann damit kein blödsinn getrieben werden.
Wenn das Objekt verändert werden soll, musst auf jeden Fall Referenz, Smart-Pointer oder normalen Pointer verwenden.
Naja, in Summe:
Ich hab C++ früher geliebt.
Inzwischen gehts mir nurmehr auf die Nerven, mir jedesmal überlegen zu müssen, was die optimale Variante ist und wie man sich am wenigstens das Hackl ins Kreuz haut. Insofern verstehe ich nciht, was Leute an Java als schwer empfinden - da kann man doch eigentlich praktisch nix falsch machen.
C++ mag anfangs auch leicht wirken, wenn man aber mal tief eintaucht, findet man dann doch ziemlich viele Fallstricke auf die man aufpassen sollte. Und viele Dinge, die man bedenken sollte (was packe ich in Header, was in Cpp, was forward deklarieren, wo forward deklarieren, in welcher Reihenfolge inkludiere ich etc.). Alles Dinge, die einem in Java einfach wurscht sein können.
Achja:
Ich kenne Libraries, die verwenden praktisch überall nurmehr einen smart-pointer bis auf gewisse Data-Holder, die kopiert werden.
Vermutlich keine schlechte Lösung für die meisten Anwendungen.
Hoffe hab jetzt in der Eile keinen Blödsinn getippt, man möge mich korrigieren