Advertisement
SmittenDreariness

No Dynamic Alloc

Nov 9th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.32 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Kwadrat
  5. {
  6.     private:
  7.         int height;
  8.         int width;
  9.     public:
  10.         Kwadrat(int height = 0, int width = 0);
  11.         /* Tutaj nie ma dynamicznej alokacji (new w konstruktorze)
  12.          * ani tablicy, więc nie potrzebny jest customowy
  13.          * konstruktor kopiujący, destruktor ani operator przypisania.
  14.          * Wystarczą te automatycznie generowane przez kompilator,
  15.          * co zostało poniżej zaznaczone przez '= default'. Można tego wgl nie pisać,
  16.          * ale tak się oszczędza czas przy kompilacji, bo od razu mówi się
  17.          * kompilatorowi żeby sam stworzył te metody - on nie traci czasu
  18.          * na samodzielne dedukowanie tego.
  19.          */
  20.         Kwadrat(const Kwadrat& kwad) = default;             // konst. kopiujący
  21.         ~Kwadrat() = default;                               // destruktor
  22.         Kwadrat& operator=(const Kwadrat& kwad) = default;  // oper. przypisania
  23.         Kwadrat operator+(const Kwadrat& kwad); // jakieś tam operacje
  24.         /*friend operator+(const Kwadrat& kwad1, const Kwadrat& kwad2); // to dla porównania z powyższym*/
  25.         Kwadrat operator-(const Kwadrat& kwad);
  26.         Kwadrat operator*(const Kwadrat& kwad);
  27.         void show();                            // zwykła metoda wyświetlająca, używająca cout
  28.        
  29.         /* Pod spodem znajduje się przeciążająca operator << funkcja zaprzyjaźniona z klasą.
  30.          * Funkcje friend, nie są wywoływane na rzecz obiektu!
  31.          * Dlatego ta funkcja bierze jako argument const Kwadrat& kwad i wyświetla jego pola.
  32.          * Co to znaczy? Przykład:
  33.          *
  34.          * Kwadrat k1(2, 3);
  35.          * cout << k1;
  36.          *
  37.          * W takim zapisie k1, nie wywołuje funkcji operator<<. Z tego powodu
  38.          * wewnątrz funkcji this->height nie ma sensu i nie odwoływałoby się do niczego.
  39.          */
  40.         friend ostream& operator<<(ostream& os, const Kwadrat& kwad); // funkcja zaprzyjaźniona z klasą -> uwaga! to nie jest metoda klasy!
  41.        
  42. };
  43.  
  44. Kwadrat::Kwadrat(int height, int width) // konstruktor
  45. {
  46.     this->height = height;
  47.     this->width = width;
  48. }
  49.  
  50. /* Poniższe funkcje operator+ robią to samo.
  51.  * Różnica jest tylko w sposobie zapisu.
  52.  * Metody klasy są wywoływane na rzecz obiektu.
  53.  * Wewnątrz metod klasy istnieje wskaźnik this, który odwołuje się do obiektu wywołującego metodę.
  54.  * Oznacza to, że jeżeli mamy zapis w kodzie:
  55.  *
  56.  * k3 = k1 + k2;
  57.  *
  58.  * i zarówno k1, k2 i k3 to obiekty typu Kwadrat i zostaje wywołana metoda składowa operator+ to w zapisie
  59.  *
  60.  * temp.height = this->height + kwad.height;
  61.  *
  62.  * this->height jest równoważne k1.height
  63.  * kwad.height jest równoważne k2.height
  64.  *
  65.  *
  66.  * Funkcje zaprzyjaźnione nie są wywoływane na rzecz obiektu.
  67.  * Oznacza to, że jeżeli potrzebują dwóch obiektów do wykonania operacji (na przykład dodawanie jest dwuargumentowe, nie?)
  68.  * to oba obiekty muszą być przekazane jako argumenty.
  69.  *
  70.  * To powoduje różnice w wyglądzie inicjalizacji metody i funkcji zaprzyjaźnionej z klasą:
  71.  *
  72.  * Kwadrat operator+(const Kwadrat& kwad) ----> to jest metoda składowa i posiada obiekt wywołujący, więc jeden arg jest "ukryty"
  73.  *                                              i dostępny w deklaracji pod wskaźnikiem this
  74.  *
  75.  * friend Kwadrat operator+(const Kwadrat& kwad1, const Kwadrat& kwad2) -----> to jest funkcja zaprzyjaźniona i one nie ma obiektu
  76.  *                                                                             wywołującego, więc musi mieć dwa argumenty i co za tym idzie
  77.  *                                                                             w deklaracji nie ma dostępu do wskaźnika this
  78.  * Różnice w deklaracji polegają na tym, że w funkcji zaprzyjaźnionej NIE UŻYWAMY this.
  79.  * Deklaracje zamieszczono poniżej.
  80.  */
  81.  
  82. Kwadrat Kwadrat::operator+(const Kwadrat& kwad) // deklaracja metody składowej
  83. {
  84.     Kwadrat temp;
  85.     temp.height = this->height + kwad.height; /* użyte this wskazujące na obiekt wywołujący */
  86.     temp.width = this->width + kwad.width;
  87.     return temp;
  88. }
  89.  
  90. /*
  91. Kwadrat operator+(const Kwadrat& kwad1, const Kwadrat& kwad2) // funkcja zaprzyjaźniona
  92. {
  93.     Kwadrat temp;
  94.     temp.height = kwad1.height + kwad2.height; ---> brak dostępu do this, stąd przyjmuje 2 argumenty
  95.     temp.width = kwad1.width + kwad2.width;
  96.     return temp;
  97. }
  98. */
  99.    
  100.  
  101. Kwadrat Kwadrat::operator-(const Kwadrat& kwad)
  102. {
  103.     Kwadrat temp;
  104.     temp.height = this->height - kwad.height;
  105.     temp.width = this->width - kwad.width;
  106.     return temp;
  107. }
  108.  
  109.  
  110. Kwadrat Kwadrat::operator*(const Kwadrat& kwad)
  111. {
  112.     Kwadrat temp;
  113.     temp.height = this->height * kwad.height;
  114.     temp.width = this->width * kwad.width;
  115.     return temp;
  116. }
  117.  
  118. void Kwadrat::show()
  119. {
  120.     cout << "Height: " << height << endl
  121.          << "Width: " << width << endl;
  122. }
  123.  
  124. /* Zaprzyjaźniona funkcja operatorowa << pozwalająca wyświetlić Kwadrat
  125.  * przyjmuje referencje na obiekt typu ostream. Cout jest obiektem typu ostream.
  126.  * Tutaj obiekt ostream ma nazwe os (obojętnie jaka) i do os streamujemy napis tak jak do cout.
  127.  * Na koniec zwracamy os i śmiga tak:
  128.  *
  129.  * Kwadrat k1;
  130.  * cout << k1;
  131.  *
  132.  * cout jest z lewej strony, ponieważ jest w funkcji jako pierwszy argument.
  133.  * k1 jest z prawej strony, ponieważ jest w funkcji jako drugi argument.
  134.  * Bierze const Kwadrat& jako argument, bo jak każda funkcja zaprzyjaźniona nie jest wywoływana przez obiekt.
  135.  */
  136. ostream& operator<<(ostream& os, const Kwadrat& kwad)
  137. {
  138.     os << "Height: " << kwad.height << endl
  139.        << "Width: " << kwad.width << endl;
  140.     return os;
  141. }
  142.  
  143. int main()
  144. {
  145.     Kwadrat k(1, 2);
  146.     k.show();
  147.     cout << k;
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement