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.
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ę.
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.
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.
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ę.
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.
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