´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´
Transkrypt
´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´
Struktura i klasa! ! Struktura jest sposobem na umieszczenie w jednym obiekcie składników o różnych typach.! ! Przykład:! !struct Zwierz { }; int wiek, string imie; bool plec; void glos() { cout <<”jestem ” << imie <<”, straszny zwierz \n”; } ! Od tej chwili można deklarować zmienne typu Zwierz i przypisywać wartości jego składnikom oraz wywoływać jego funkcje, zwane tu: metody. Odwołanie do składnika jest realizowane w notacji kropki:! ! nazwaZmiennej.składnik ! Przykład:! ! Zwierz z; z.imie = ”Puszek”; z.wiek = 12; z.plec = true; z.glos(); Klasa jest innym sposobem na umieszczenie w jednym obiekcie składników o różnych typach.! Różnice w stosunku do struktury:! • Słowo kluczowe class zamiast struct.! • W strukturze wszystkie składniki są publicznie dostępne, zaś w klasie można ustawiać modyfikator dostępu do poszczególnych składników jako: private, public lub protected. Domyślnie wszystkie składniki są private.! • Można tworzyć klasy potomne dla wybranej klasy bazowej, potomek dziedziczy składniki klasy bazowej (niekoniecznie wszystkie) i może mieć dodatkowe własne składniki.! • Zmienna strukturalna jest przekazywana przez wartość, zaś instancja klasy - przez referencję.! ! Zarówno struktura jak i klasa mogą mieć metodę zwaną konstruktorem. Konstruktor ma za zadanie przydzielić odpowiedni rozmiar pamięci dla zmiennej i ewentualnie zainicjować wartości składników.! Jeśli nie zdefiniujesz własnego konstruktora, system utworzy domyślny konstruktor bezparametrowy.! Jeśli zdefiniujesz własny konstruktor, to domyślny już nie będzie tworzony automatycznie. Można zdefiniować kilka konstruktorów do tej samej klasy/struktury, różniące się liczbą parametrów. ! Konstruktor zawsze ma nazwę identyczną z nazwą klasy/struktury, nie zwraca żadnego typu, nawet void i musi być publiczny.! ! Zmienna prywatna klasy jest dostępna tylko dla metod tej klasy. Trzeba utworzyć wewnątrz klasy:! • metodę która pozwala ustawić wartość zmiennej prywatnej, tak zwany setter,! • metodę która pozwala odczytać wartość zmiennej prywatnej, tak zwany getter.! !#include <iostream> using namespace std; !class Zwierz { int wiek; public: string imie; bool plec; void glos() { // wiek jest składnikiem prywatnym // pozostałe składniki są publiczne! // przykładowa metoda klasy } if (plec) cout << "Mr. "; else cout << "Mrs. "; cout << imie << " z rocznika " << 2014-wiek << endl; int getWiek() { return wiek; } void setWiek(int n) { wiek = n;} // getter dla zmiennej prywatnej // setter dla zmiennej prywatnej Zwierz(string name, int age, bool sex) { // konstruktor 3-parametrowy imie = name; wiek = age; plec = sex; } }; Zwierz(string name, bool sex) { imie = name; plec = sex; } // konstruktor 2-parametrowy Zwierz() {} // konstruktor bezparametrowy class Pies : public Zwierz { public: string rasa; ! ! }; // klasa Pies jest potomkiem klasy Zwierz // dziedziczy jej składniki publiczne Pies(){} // konstruktor klasy potomka wywołuje konstruktor klasy bazowej dla pól które dziedziczy Pies(string q, bool x, string r):Zwierz(q,x) { rasa = r; }! void glos() { // potomek może mieć metodę o nazwie takiej samej jak klasa bazowa! if (plec) cout << "Mr. "; else cout << "Mrs. "; cout << imie << " rasa " << rasa << endl; } !int main() { ! ! } Zwierz a; // tworzenie obiektu bez inicjacji składników //a.wiek = 5; // tak nie można odwołać się do zmiennej prywanej! a.setWiek(5); // trzeba to zrobić za pomocą publicznej metody ! a.imie = "Rex"; a.plec = true; cout <<a.imie << " ma lat " << a.getWiek() << endl; a.glos(); Zwierz b = Zwierz("Huba",8,false); b.glos(); // tworzenie obiektu z inicjacją składników Pies p; // tworzenie obiektu bez inicjacji składników! p.imie = "Bari"; p.plec = true; p.rasa = "mieszaniec"; p.glos(); Pies q = Pies("Yuma",false,"chihuahua"); // tworzenie obiektu z inicjacją składników! q.glos(); // wywołanie metody własnej klasy! q.Zwierz::glos(); // wywołanie metody klasy bazowej! return 0;