go to start Questions For Exam Preparation HS18
|home |print view |recent changes |changed December 21, 2018 |
exact
|You are 18.206.168.65 <- set your identity!

Sections: References & Const (bei =[dynArray]=) | Wann sind die Parameter const, wann sind es Referenzen? | Wann ist die ganze Funktion const? | Wann ist der Rückgabewert const, wann ist es eine Referenz? | Kann bei den Iteratoren(iterator, const_iterator, const_reverse_iterator) jeweils eine Kopie zurückgeben, da der Value bereits eine Referenz ist (natürlich bei den Const-Iteratoren muss die Memberfunktion noch const gemacht werden)? |

References & Const (bei dynArray) ^

Wann sind die Parameter const, wann sind es Referenzen? ^

Parameter sind immer dann const Referenzen wenn eine Kopie vermieden werden soll und trotzdem eine Garantie abgegeben wird, dass die Funktion den Parameter nicht modifiziert (aus Sicht der Aufruferseite). Also eigentlich immer wenn keine Modifikation notwendig ist bei grossen Objekten.

Wann ist die ganze Funktion const? ^

Member Funktionen können const sein (Am Ende der Signatur wird dabei das const-Keyword eingefügt. Dies ist vergleichbar mit der const-Deklaration eines normalen Funktionsparameters. Bei einer const Member Funktion bezieht sich das const auf das implizite this-Objekt einer Member Funktion. Entsprechend ist in einer const Member Funktion das this-Objekt unveränderbar. Dies gilt für alle Member Variablen dieses Objekts. Damit das Objekt sicher nicht verändert werden kann, darf aus einer const Member Funktion auch keine non-const Member Funktion aufgerufen werden. Dies gilt auch für const-Objekte. Von diesen dürfen keine non-const Member Funktionen aufgerufen werden. Beim dynArray wäre das zum Beispiel falsch die size() Member Funktion nicht als const zu deklarieren. Diese wäre nicht aufrufbar für ein const dynArray. Jedoch gibt es keinen Grund size() nicht aufrufen zu können, wenn das Objekt unveränderbar ist.

Wann ist der Rückgabewert const, wann ist es eine Referenz? ^

Refenzen können bei Funktionen auf Parameter oder den Rückgabe-Typ angewendet werden. Dabei Wechselt die Referenz den Typ. Statt ein ganzes Objekt zu repräsentieren, ist einer Referenz von einem Typ quasi nur ein neuer Name für ein bestehendes Objekt. Beispielsweise auf das dynArray bezogen bedeutet es, dass die Zugriffsoperationen (wie at(), operator[], etc.) entweder das zurückgegebene Objekt kopieren (ohne Referenz) oder einen Zugriff auf das Objekt innerhalb des Containers anbieten (mit Referenz). Aus Sicht der Benutzung bedeutet es, dass man mit Referenzen die Möglichkeit hat ein Objekt innerhalb des Containers zu verändern. Ansonsten, wenn man nur eine Kopie erhält, müsste man diese anschliessend neu in den Container einfügen, nachdem das Objekt verändert wird. Deshalb ist es richtig, dass die Zugriffs-Member-Funktionen beim dynArray Referenzen zurückgeben.

Beide Mechanismen (Referenzen und const können und sollten kombiniert werden. Beim dynArray sollten alle Zugriffsoperationen als const und non-const angeboten werden. Wobei die const-Variante den Zugriff nur über const-Referenzen auf die inneren Objekte anbietet. Dies ermöglicht den Zugriff auf die Elemente des Containers, ohne dass eine Kopie gemacht wird. Trotzdem ist es möglich auf einen const und einen non-const Container zuzugreifen und dabei die Integrität zu erhalten: Sprich wenn man ein const dynArray hat, dürfen dessen Elemente nicht verändert werden. Entsprechend bietet man den Zugriff so an, dass die Referenzen ebenfalls auf const-Elemente zeigen. Bei non-const dynArrays ist der modifizierende Zugriff aber erlaubt und deshalb wird da mit non-const Referenzen gearbeitet.

Kann bei den Iteratoren(iterator, const_iterator, const_reverse_iterator) jeweils eine Kopie zurückgeben, da der Value bereits eine Referenz ist (natürlich bei den Const-Iteratoren muss die Memberfunktion noch const gemacht werden)? ^

Bei den Iteratoren kann, bzw. muss, eine Kopie zurückgegeben werden. Diese sind relativ kleine Objekte, die auf eine Position innerhalb des Containers zeigen. Weil sie klein sind können sie problemlos kopiert werden. Durch die Member Funktionen begin(), end(), etc. des verwendeten Containers erhält man immer ein Iterator-Objekt. Wenn dieses Objekt lokal gespeichert und darauf eine Referenz zurückgegeben wird, wäre der Zugriff darauf Undefined Behavior. Die Constness der Member Funktionen bestimmen hier die Constness der zurückgegeben Iteratoren, bzw. bestimmen welche Iteratoren überhaupt erlaubt sind in diesem Kontext. Entsprechend sind dies bei const Member Funktionen jeweils const_iterator (bzw. const_reverse_iterator), da keine Modifikation über diesen Weg stattfinden darf. Bei non-const Member Funktionen können Iteratoren zurückgegeben werden, die auch eine Änderung der Werte, auf die sie zeigen, erlauben.


|home |print view |recent changes |changed December 21, 2018 |
exact
|You are 18.206.168.65 <- set your identity!

Questions For Exam Preparation HS18
go to start