Poznaj C++ w$ godziny0212

Poznaj C++ w$ godziny0212



Przeciążanie operatorów 203

ITrzy = 1Jeden + lDwa;

niż

ITrzy - 1Jeden.Dodaj(lDwa);

Niby niewielka zmiana, a program wygląda dużo lepiej i czytelniej.

Ograniczenia przy przeciążaniu operatorów

Przed wszystkim nie jest możliwe przeciążanie operatorów wbudowanych typów C++. Nie można zmienić kolejności wykonywania działań i arności działań (liczby argumentów). Nie można tworzyć nowych operatorów. Próba stworzenia np. operatora ** dla podnoszenia do potęgi nie powiedzie się.

Co i kiedy przeciążać

Przeciążanie operatorów jest często nadużywane przez początkujących programistów. Próbują oni tworzyć nowe, ciekawe zastosowania dla prostych operatorów, lecz nieodzownie prowadzi to do zbędnej komplikacji programu i nieporozumień.

Pewnie, że można przeciążyć operator + tak aby służył do odejmowania i zmusić operator * do dodawania, jednak żaden profesjonalny programista tego nie robi. Większe niebezpieczeństwo kryje się w pozornie poprawnym w zamierzeniach przeciążeniu np. operatora + do łączenia znaków w łańcuchy lub / do dzielenia łańcuchów. Można rozważyć takie rozwiązania ale z rozwagą. Pamiętaj, że przeciążanie operatorów ma zwiększać przejrzystość kodu i łatwość korzystania z niego.

Operator =

Zapewne pamiętasz, że kompilator dostarcza domyślne konstruktory, destruktory i konstruktory kopiujące. Czwartą i zarazem ostatnią funkcją którą kompilator jest w stanie zrealizować automatycznie, (jeśli sam tego nie zrobisz) to operator przypisania (=).

Ten operator jest wykorzystywany przy każdym przypisaniu. Np.:

KOT kotJeden(5, 7);

KOT kotDwa(3, 4);

// ... kod

kotJeden = kotDwa;

Są tworzone dwa obiekty: kot Jeden (wiek 5, waga 7) i kotDwa (wiek 3 i waga 4).

Zauważ, że w tym przypadku nie ma potrzeby wywoływania konstruktora kopiującego. Obiekt kotDwa już istnieje i nie trzeba go tworzyć.

W trakcie godziny 13, „Zaawansowane funkcje” omówiliśmy różnice pomiędzy płytkim i głębokim (pełnym) kopiowaniu obiektów. Płytkie kopiowanie powoduje, że zarówno oryginał jak i kopia wskazują na te same obszary na stercie. Kopiowanie głębokie rezerwuje pamięć i kopiuje do nich zawartość obszarów wskazywanych

ITrzy = 1Jeden + lDwa;

niż

ITrzy = lJeden.Dodaj(lDwa);

Niby niewielka zmiana, a program wygląda dużo lepiej i czytelniej.

Ograniczenia przy przeciążaniu operatorów

Przed wszystkim nie jest możliwe przeciążanie operatorów wbudowanych typów C++. Nie można zmienić kolejności wykonywania działań i arności działań (liczby argumentów). Nie można tworzyć nowych operatorów. Próba stworzenia np. operatora ** dla podnoszenia do potęgi nie powiedzie się.

Co i kiedy przeciążać

Przeciążanie operatorów jest często nadużywane przez początkujących programistów. Próbują oni tworzyć nowe, ciekawe zastosowania dla prostych operatorów, lecz nieodzownie prowadzi to do zbędnej komplikacji programu i nieporozumień.

Pewnie, że można przeciążyć operator + tak aby służył do odejmowania i zmusić operator * do dodawania, jednak żaden profesjonalny programista tego nie robi. Większe niebezpieczeństwo kryje się w pozornie poprawnym w zamierzeniach przeciążeniu np. operatora + do łączenia znaków w łańcuchy lub / do dzielenia łańcuchów. Można rozważyć takie rozwiązania ale z rozwagą. Pamiętaj, że przeciążanie operatorów ma zwiększać przejrzystość kodu i łatwość korzystania z niego.

Operator =

Zapewne pamiętasz, że kompilator dostarcza domyślne konstruktory, destruktory i konstruktory kopiujące. Czwartą i zarazem ostatnią funkcją, którą kompilator jest w stanie zrealizować automatycznie, (jeśli sam tego nie zrobisz) to operator przypisania (=).

Ten operator jest wykorzystywany przy każdym przypisaniu. Np.:

KOT kotJeden(5, 7);

KOT kotDwa(3, 4);

II... kod

kotJeden = kotDwa;

Są tworzone dwa obiekty: kot Jeden (wiek 5, waga 7) i kotDwa (wiek 3 i waga 4).

Zauważ, że w tym przypadku nie ma potrzeby wywoływania konstruktora kopiującego. Obiekt kotDwa już istnieje i nie trzeba go tworzyć.

W trakcie godziny 13, „Zaawansowane funkcje” omówiliśmy różnice pomiędzy płytkim i głębokim (pełnym) kopiowaniu obiektów. Płytkie kopiowanie powoduje, że zarówno oryginał jak i kopia wskazują na te same obszary na stercie. Kopiowanie głębokie rezerwuje pamięć i kopiuje do nich zawartość obszarów wskazywanych


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0204 Przeciążanie operatorów W poprzednim rozdziale nauczyłeś się przeciążać me
Poznaj C++ w$ godziny0208 Przeciążanie operatorów 199Listing 14.3. Operator przedrostkowy i
Poznaj C++ w$ godziny0210 Przeciążanie operatorów 201 Przeciążanie operatorów
Poznaj C++ w$ godziny0216 Przeciążanie operatorów 207 EFEKT DZIAŁANIA: Compile error! Unable to conv
Poznaj C++ w$ godziny0218 Przeciążanie operatorów 209 23:    {} 24: 25:
Poznaj C++ w$ godziny0206 197Przeciążanie operatorów Listing 14.2. Przeciążenie operatora
Poznaj C++ w$ godziny0214 Przeciążanie
Poznaj C++ w$ godziny0011 X Poznaj C++ w 24 godziny Ograniczenia przy przeciążaniu operatorów
Poznaj C++ w$ godziny0219 210 Godzina 14Pytania i odpowiedzi P: Po co przeciążać operator skoro możn
Poznaj C++ w$ godziny0061 46 Godzina 4Operatory relacji Operatory relacji są używane do określenia,
Poznaj C++ w$ godziny0068 Instrukcje i wyrażenia 53 Tabela 4.2. Operatory logiczne Operator Symbol
Poznaj C++ w$ godziny0069 54 Godzina 4Kolejność wykonywania operatorów logicznych Operatory relacji
Poznaj C++ w$ godziny0144 Wskaźniki 133 Operator dostępu pośredniego ( * ) jest używany w dwóch różn
Poznaj C++ w$ godziny0193 184 Godzina 13 Listing 13.1. Przeciążanie wewnętrznych funkcji
Poznaj C++ w$ godziny0197 188 Godzina 13Wartości domyślne czy przeciążanie funkcji Programy 13.1 i 1
Poznaj C++ w$ godziny0203 194 Godzina 13Pytania i odpowiedzi P: Dlaczego wymyślono wartości domyślne
Poznaj C++ w$ godziny0207 198 Godzina 14 198 Godzina 14 ANALIZA: Implementacja operatora ++, zawarta
Poznaj C++ w$ godziny0211 202 Godzina 14Listing 14.5. Operator
Poznaj C++ w$ godziny0217 208 Godzina 14 licz: 5 ANALIZA: W linii 11 zaszła ważna zmiana. Przeciążyl

więcej podobnych podstron