´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´

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;

Podobne dokumenty