3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane obiektowo Zorientowane obiektowo programowanie (object-oriented programming) opiera się na trzech podstawowych koncepcjach: abstrakcyjnych typów danych, dziedziczenia, wiązań dynamicznych. Polimorfizm, wiele form, oznacza, Ŝe obiekty, operacje zachowują się w róŝnych sposób w zaleŝności od kontekstu. Przykłady typów polimorficznych: zmienne które przyjmują róŝne typy w zaleŝności od kontekstu, przeładowane funkcje, metody, operatory, typy danych które są w relacji dziedziczenia. Obiekt (definicja Ecma/TC39-TG5/2004/25) - jest instancją typu. Obiekt (definicja ISO/IEC 14882:2003(E)) jest to obszarem pamięci. Obiekt jest tworzony za pomocą definicji, wyraŝenia new, lub implementacji. Obiekt ma nazwę, czas Ŝycia, typ. Uwaga: Funkcja nie jest obiektem, chociaŝ zajmuje obszar w pamięci. 1
3.2 Unie Programowanie 2. Język C++. Wykład 3. union <nazwaunii> <elementyunii> ; Własności: 1. Unie moŝna definiować bez nazwy (anonimowe). Anonimowe unie nie mogą mieć elementów private, protected, zawierać metod. 2. Unie nie mogą dziedziczyć od klas, struktur. 3. Domyślny typ dostępu do elementów unii jest public. 4. Atrybuty unii nie mogą być inicjowane w unii. Inicjowanie atrybutów moŝe odbywać za pomocą konstruktorów. 5. Unia nie moŝe zawierać referencji, obiektów. 6. Wielkość unii określona jest przez wielkość największego jej elementu. Przykład 1. Definicja, wielkość unii (w03-01-uniadefinicja.cpp). union unia char ch; float f; double d; ; void main() unia x; unia * wsk; cout << "sizeof(x.ch) = " << sizeof(x.ch) << endl; cout << "sizeof(x.d) = " << sizeof(x.d) << endl; cout << "sizeof(unia) = " << sizeof(unia) << endl << endl; wsk = &x; cout << "&x cout << "wsk = " << (long)&x << endl; = " << (long)&wsk << endl << endl; x.ch = 'c'; cout << "x.ch = " << x.ch << endl; cout << "wsk->ch = " << wsk->ch << endl << endl; 2
3.3 Struktury Programowanie 2. Język C++. Wykład 3. struct <nazwa struktury> <elementy struktury> ; Własności: 1. Domyślny typ dostępu do elementów struktury jest public. 2. Struktura moŝe zawierać konstruktora, destruktora. 3. Struktura moŝe dziedziczyć od struktury, klasy. 4. W strukturze nie moŝna inicjować zmiennych. 5. W strukturze moŝna inicjować zmienne typu static const. Przykład 1. Definicja struktury (w3-02-strukturadefinicja.cpp). #include<iostream> struct S char c; char f(); ; char S :: f() c = 'a'; return c; typedef struct char c; ts; void main() S s; s.i = 99; char cc; cc = s.f(); cout <<"s.f() = " << cc << endl; ts s1; ts *ps = &s1; ps->c = 'a'; ps->i = 10; cout << "ps->c = " << ps->c << endl; cout << "ps->i = " << ps->i << endl; cout << "&ps = " << &ps << endl; 3
3.4 Klasy Programowanie 2. Język C++. Wykład 3. class <nazwa klasy> <elementy klasy> ; Własności: 1. Domyślny typ dostępu do elementów struktury jest private. 2. Klasa moŝe być wirtualna, abstrakcyjna. 3. Klasy moŝna zagnieŝdŝać. 4. W klasie moŝna inicjować tylko zmienne typu static const. Przykład 1. Definicja klasy, metody (w03-03-klasadefinicja.cpp). class A void fa(); protected: ; void A::fA() cout <<"fa()" << endl; void main() A a; a.fa(); A &ra = a; ra.fa(); A *pa = &a; pa->fa(); A *p = new A; p->fa(); (*p).fa(); delete p; 4
3.5 Elementy klasy W klasie moŝna definiować: atrybuty, czyli zmienne, wskaźniki, referencje, obiekty innych klas, metody, czyli funkcje w klasie, operatory, klasy, struktury, unie, konstruktory, destruktora. Konstruktor klasy jest to metoda która: ma taką samą nazwę jak klasa, nie moŝe nic zwracać moŝe być przeładowany, moŝe być wirtualny, moŝe być zdefiniowany w obszarze private. Konstruktor słuŝy do tworzenia i inicjowanie obiektów. Destruktor klasy to metoda która: ma taką samą nazwę jak klasa, nazwa poprzedzona jest znakiem ~, np. ~A(), gdzie A jest nazwą klasy, nie moŝe nic zwracać, nie moŝe mieć argumentów, musi być w obszarze public. Destruktor słuŝy do usuwania obiektów z pamięci. Przykład 1. Domyślny konstruktor, destruktor obiektu (w03-04-konstruktor.cpp). class A A() cout <<"A()" << endl; ~A() cout <<"~A()" << endl; void f() cout <<" f() w A" << endl; ; void main() A a; a.f(); A &r = a; r.f(); // wywoływany jest konstruktor A() // konstruktor A() nie jest wywoływany A *p = new A; // wywoływany jest konstruktor A() p->f(); delete p; 5
Przykład 2. Przeładowanie konstruktora (w03-05-konstruktorprzeladowany.cpp). #include<iostream> class A // A() cout << "A()" << endl; // domyślny konstruktor A(int x) : i(x) cout << "A(int)" << endl; ~A() cout << "~A()" << endl; void f() cout << this->i << endl; ; void main() // A a; // błąd C2512, brak domyślnego konstruktora A() A b(100); b.f(); // A *pa1 = new A; // błąd C2512, brak domyślnego konstruktora A() // delete pa1; A *pa2 = new A(200); pa2->f(); delete pa2; Przykład 3. Inicjowanie atrybutów klasy (w03-06-klasaatrybuty.cpp). class A // A() A(int x) : i(x+2) ii = x; ~A() void f(int); int g()return ii; int ii; ; void A :: f(int x) i = ii*x; void main() A a(200); cout << "a.i = " << a.i << endl; cout << "a.ii = " << a.g() << endl; a.i = 300; a.f(10); A b(300); cout << "b.i = " << b.i << endl; cout << "b.ii = " << b.g() << endl; 6
3.6 Dostęp do elementów klasy class <nazwa klasy> <elementy klasy private> <elementy klasy> protected: <elementy klasy> <elementy klasy> ; Typy dostępu do elementów klasy: Elementy klasy dostępne dla obiektów zdefiniowanych wewnątrz private klasy. protected public Elementy klasy dostępne dla obiektów zdefiniowanych wewnątrz klasy i obiektów klas dziedzicznych. Elementy klasy dostępne dla obiektów klasy i obiektów klas dziedzicznych. 7
Przykład 1. Dostęp do elementów klasy (w03-07-typdostepu.cpp). class A A() ia=99; void f1a(); protected: void f2a() cout << "protected f2a()" << endl; void f3a() cout << "private f3a()" << endl; int ia; ; void A::f1A() cout << "public f1a()" << endl; this->f3a(); // ok, f3a()jest private this->ia=100; // ok, ia jest private cout << ia << endl; class B : public A // musi być public void f1b() this->f2a(); //ok, f2a() jest proteced // void f2b() this->f3a(); // błąd, f3a() jest private protected: ; void main() B b; b.f1b(); b.f1a(); // B dziedziczy od A, f1a() public // b.f2a(); // błąd dostępu, f2a() protected A a; a.f1a(); //ok, f1a() jest public // a.f2a(); // błąd dostępu, f2a() protected // a.f3a(); // błąd dostępu, f3a() private // a.ia = 101; // błąd dostępu, ia private 8
Przykład 2. Dostęp do elementów klasy. Kompozycja, obiekty zagnieŝdŝone prywatnie. (w03-08-dostep.cpp). class A void fa() cout << "public fa()" << endl; ; class B void fb(); A a; ; void B::fB() cout << "public fb() "; a.fa(); void main() B b; b.fb(); Przykład 3. Dostęp do elementów protected (w03-09-dostepprotected.cpp). class A int fa() this->ia = 100; return this->ia; protected: int ia; ; class B : A int fb() this->ia = 200; return this->ia; ; void main() A a; B b; cout << a.fa() << endl; cout << b.fb() << endl; // cout << b.fa() << endl; // błąd, musi być class B : public A 9
3.7 Wskaźnik this Wskaźnik this wskazuje na obiekt danej klasy. SłuŜy do wywoływania metod, manipulowania atrybutami wewnątrz klasy. Przykład 1. UŜycie wskaźnika this ( w03-10-this.cpp). #include<iostream> class A A(int x) : i(x) void f1() const cout << i << endl; void f2() const; void f3(int); ; void A::f2() const f1(); cout << this->i << endl; // jawne uŝycie wskaźnika this this->f1(); void A::f3(int x) this->i = x; cout << i << endl; void main() A a(100); a.f1(); a.f2(); a.f3(200); 10