Referenztypen Flashcards

1
Q

Betrachte folgenden Code:

πšŸπš˜πš’πš πšœπš πšŠπš™(πš’πš—πš 𝚑, πš’πš—πš 𝚒) {
  πš’πš—πš 𝚝 = 𝚑; 
  𝚑 = 𝚒; 
  𝚒 = 𝚝; 
}
πš’πš—πš πš–πšŠπš’πš—() {
    πš’πš—πš 𝚊 = 𝟸; 
    πš’πš—πš πš‹ = 𝟷; 
    πšœπš πšŠπš™(𝚊, πš‹); 
    πšŠπšœπšœπšŽπš›πš(𝚊 == 𝟷 && πš‹ == 𝟸); 
}

Wo kommt es hier zu einem Problem und warum? Wie kann man es beheben?

A

Die Variablen 𝚑 und 𝚒 sind nur in der Funktion definiert, jedoch nicht ausserhalb. So macht die πšœπš πšŠπš™-Funktion also rein gar nichts (auch wenn in der main-Function statt a und b erneut x und y verwendet werden.)

Das Programm bricht also bei der Assertion ab.

Um dies zu umgehen, macht man eine Referenz β€œ&” zu den in der Funktion definierten Variablen, so dass das Programm weiss, auf diese Werte zugreifen zu mΓΌssen:

πšŸπš˜πš’πš πšœπš πšŠπš™(πš’πš—πš& 𝚑, πš’πš—πš& 𝚒) {
…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Sei πšƒ ein Typ (z.B. πš’πš—πš). Welche zwei Dinge hat der Referenztyp πšƒ& mit πšƒ gemeinsam und welche sind anders und inwiefern?

A

Gleich sind Wertebereich und FunktionalitΓ€t (πš’πš—πš und πš’πš—πš& reprΓ€sentieren z.B. beide die ganzen Zahlen und haben den gleichen Wertebereich).
Verschieden hingegen sind Initialisierung und Zuweisung:
- Eine Referenz muss mit einem L-Wert initialisiert werden.
- Die Variable wird dabei ein Alias des L-Werts .
- Zuweisung an die Referenz erfolgt an das Objekt hinter dem Alias.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Betrachte die beiden Initialisierungen:
πš’πš—πš& πš“;
πš’πš—πš& πš” = 𝟻;

Weshalb sind diese Initialisierungen ungΓΌltig?

A

πš’πš—πš& πš“; geht nicht, da πš“ das Alias von irgendetwas sein muss, so wird πš“ also keiner Adresse zugewiesen.
Bei πš’πš—πš& πš” = 𝟻; ist es Γ€hnlich, da Literale (hier 𝟻) keine Adresse besitzen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Was bedeutet β€œPass by Reference”?

A

Ein formales Argument wird intern mit der Adresse des Aufrufarguments (L-Wert) initialisiert und damit zu einem Alias.
Dies ist nur mΓΆglich, wenn das formale Argument einen Referenztyp hat.

Bsp.:
Sei πš“ eine in der main-Funktion deklarierte Variable und πš’ eine in einer anderen Funktion deklarierte Variable, so wird beim Aufrufen der Funktion πš’ mit πš“ initialisiert, die Funktion ΓΌber πš’ ausgefΓΌhrt und der Endwert von πš’ (immer noch innerhalb der Funktion) dann πš“ zugewiesen und in die main-Funktion β€œzurΓΌckgeschickt”.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Was passiert, wenn das formale Argument keinen Referenztyp hat?

A

Es wird mit dem Wert des Aufrufarguments (R-Wert) initialisiert und damit zu einer Kopie.
Dies wird β€œPass by Value” genannt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Was versteht man unter β€œReturn by Reference”?

A

Dass der RΓΌckgabetyp einer Funktion wiederum ein Referenztyp ist, z.B.:

πš’πš—πš& πš’πš—πšŒ(πš’πš—πš& πš’) {
πš›πšŽπšπšžπš›πš— ++πš’;
}

Der Aufruf πš’πš—πšŒ(𝚑) hat fΓΌr eine πš’πš—πš-Variable 𝚑 die selbe Semantik wie ++𝚑. Der Funktionsaufruf ist folglich selbst ein L-Wert, so dass Dinge mΓΆglich sind, wie:
πš’πš—πšŒ(πš’πš—πšŒ(𝚑)) oder ++(πš’πš—πšŒ(𝚑)).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Welches ist die Richtlinie fΓΌr den Gebrauch von Referenzen?

A

Wenn man eine Referenz erzeugt, muss das Objekt, auf das sie verweist, mindestens so lange β€œleben”, wie die Referenz selbst.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Welche der folgenden Initialisierungen funktioniert und warum?

(1) πš’πš—πš& πš” = 𝟻;
(2) πšŒπš˜πš—πšœπš πš’πš—πš& πš” = 𝟻;

A

πš’πš—πš& πš” = 𝟻; funktioniert nicht, da 5 als Literal kein L-Wert ist (also keine Adresse besitzen).
πšŒπš˜πš—πšœπš πš’πš—πš& πš” = 𝟻; ist hingegen mΓΆglich, da Referenzen auf Konstanten mit R-Werten initialisiert werden dΓΌrfen (es wird mit der Adresse eines temporΓ€ren Objektes vom Wert des R-Wertes initialisiert).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Betrachte die folgenden drei Initialisierungen:

(1) πšŒπš˜πš—πšœπš πš’πš—πš πš— = 𝟻; πš’πš—πš& 𝚊 = πš—; 𝚊 = 𝟼;
(2) πš’πš—πš πš— = 𝟻; πšŒπš˜πš—πšœπš πš’πš—πš& πš› = πš—; πš› = 𝟼;
(3) πš’πš—πš πš— = 𝟻; πš’πš—πš& πš› = πš—; πš› = 𝟼;

Welche ist gΓΌltig und warum bzw. welche nicht und warum nicht?

A

(1) πšŒπš˜πš—πšœπš πš’πš—πš πš— = 𝟻; πš’πš—πš& 𝚊 = πš—; 𝚊 = 𝟼;
… ist nicht gΓΌltig, da 5 als konstant deklariert ist und somit nicht von der Referenz ΓΌberschrieben werden darf.

(2) πš’πš—πš πš— = 𝟻; πšŒπš˜πš—πšœπš πš’πš—πš& πš› = πš—; πš› = 𝟼;
… ist nicht gΓΌltig, da das Aufrufargument als konstant definiert wird und somit danach nicht mehr ΓΌberschrieben werden darf. (πšŒπš˜πš—πšœπš πš’πš—πš& πš› ist eine β€œread-only-reference”.)

(3) πš’πš—πš πš— = 𝟻; πš’πš—πš& πš› = πš—; πš› = 𝟼;
… ist gΓΌltig, da nichts als konstant definiert wird und somit nicht ΓΌberschrieben werden darf.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Wann sollte man πšŒπš˜πš—πšœπšπšƒ& als Argumenttyp in einer Funktion verwenden?

A

Die Regel lautet:
Funktionsargumenttypen, falls mΓΆglich, als πšŒπš˜πš—πšœπšπšƒ& deklarieren, da effizient und sicher.
Man verspricht so, die Aufrufargumente nachtrΓ€glich nicht mehr zu verΓ€ndern.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly