156 Godzina 11
156 Godzina 11
ANALIZA:
Podobnie jak w poprzednim przykładzie deklarujemy referencję do zmiennej intJeden. Następnie wypisujemy adresy dwóch zmiennych. Zgodnie z oczekiwaniami są one identyczne. W C++ nie ma możliwości otrzymania fizycznego adresu referencji gdyż byłoby to zbędne (w przeciwieństwie do wskaźników). Referencje są inicjalizowane w momencie tworzenia i zawsze stanowią synonim obiektu docelowego, nawet w przypadku użycia operatora adresu.
Np. jeśli miałbyś klasę o nazwie Prezydent, mógłbyś zadeklarować obiekt tej klasy następująco:
Prezydent William_Jefferson_Clinton;
Teraz możesz zadeklarować referencję do obiektu klasy Prezydent:
Prezydent &Bill_Clinton = William_Jefferson_Clinton;
W pamięci będzie istnieć tylko jeden obiekt. Obydwa stworzone identyfikatory odnoszą się do tego obiektu. Każda operacja wykonana na obiekcie Bill_Clinton zostanie również wykonana na William_Jef ferson_Clinton.
Pamiętaj, aby odróżniać symbol & w linii 9 listingu 11.2, który deklaruje referencje
0 nazwie rReferencja do obiektu int, a symbolem & w liniach 15 i 16, zwracającym adres odpowiednio zmiennej intJeden i rReferencja.
Normalnie, przy wykorzystywaniu referencji, nie jest Ci potrzebny operator adresu. Po prostu używasz referencji tak, jak obiektu docelowego. Widać to w linii 13.
Czasami nawet doświadczeni programiści nie są pewni, co się stanie, przy próbie ponownego przypisania do referencji. Okazuje się, że taka operacja powoduje przypisanie nowej wartości do obiektu docelowego (co po chwili namysłu jest oczywiste
1 zgodne z definicją referencji). Ilustruje to listing 11.3.
1: // Listing 11.3
2: // Przypisywanie do referencji
3:
4: #include <iostream.h>5:
6: int main () 7: {
8: int intJeden;
9: int SrReferencja = intJeden;
10:
11: intJeden = 5;
12: cout « "intJeden:\t" « intJeden « endl;
13: cout « "rReferencja:\t" « rReferencja « endl;
14: cout « "SintJeden:\t" « SintJeden « endl;
15: cout « "SrReferencja:\t" « SrReferencja « endl;
16:
17: int intDwa = 8;
18: rReferencja = intDwa; // zastanów sie nad ta linia!
19: cout « "\nintJeden:\t" « intJeden « endl;
20: cout « "intDwa:\t\t" « intDwa « endl;
21: cout « "rReferencja:\t" « rReferencja « endl;
22: cout « "SintJeden:\t" « SintJeden « endl;
Podobnie jak w poprzednim przykładzie deklarujemy referencję do zmiennej intJeden. Następnie wypisujemy adresy dwóch zmiennych. Zgodnie z oczekiwaniami są one identyczne. W C++ nie ma możliwości otrzymania fizycznego adresu referencji gdyż byłoby to zbędne (w przeciwieństwie do wskaźników). Referencje są inicjalizowane w momencie tworzenia i zawsze stanowią synonim obiektu docelowego, nawet w przypadku użycia operatora adresu.
ANALIZA
Np. jeśli miałbyś klasę o nazwie Prezydent, mógłbyś zadeklarować obiekt tej klasy następująco:
Prezydent William_Jefferson_Clinton;
Teraz możesz zadeklarować referencję do obiektu klasy Prezydent:
Prezydent SBill_Clinton = William_Jefferson_Clinton;
W pamięci będzie istnieć tylko jeden obiekt. Obydwa stworzone identyfikatory odnoszą się do tego obiektu. Każda operacja wykonana na obiekcie Bill_Clinton zostanie również wykonana na William_Jefferson_Clinton.
Pamiętaj, aby odróżniać symbol & w linii 9 listingu 11.2, który deklaruje referencje
0 nazwie rReferencja do obiektu int, a symbolem & w liniach 15 i 16, zwracającym adres odpowiednio zmiennej intJeden i rReferencja.
Normalnie, przy wykorzystywaniu referencji, nie jest Ci potrzebny operator adresu. Po prostu używasz referencji tak, jak obiektu docelowego. Widać to w linii 13.
Czasami nawet doświadczeni programiści nie są pewni, co się stanie, przy próbie ponownego przypisania do referencji. Okazuje się, że taka operacja powoduje przypisanie nowej wartości do obiektu docelowego (co po chwili namysłu jest oczywiste
1 zgodne z definicją referencji). Ilustruje to listing 11.3.
1: // Listing 11.3
2: II Przypisywanie do referencji
3:
4: #include <iostream.h>5:
6: int roain()7: {
8: int intJeden;
9: int SrReferencja = intJeden;
10:
11: intJeden = 5;
12: cout « "intJeden:\t" « intJeden « endl;
13: cout « "rReferencja:\t" « rReferencja « endl;
14: cout « "SintJeden:\t" « SintJeden « endl;
15: cout « "SrReferencja:\t" « SrReferencja « endl;
16:
17: int intDwa = 8;
18: rReferencja = intDwa; // zastanów sie nad ta linia!
19: cout « "\nintJeden:\t" « intJeden « endl;
20: cout « "intDwa:\t\t" « intDwa « endl;
21: cout « "rReferencja:\t" « rReferencja « endl;
22: cout « "SintJeden:\t" « SintJeden « endl;