C Klasy


Podstawy informatyki
Elektrotechnika I rok
Język C++
Klasy  pojęcia podstawowe
Instrukcja do ćwiczenia
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH
Kraków 2006
JZYK C++  KLASY  POJCIA PODSTAWOWE
Tematyka i cel ćwiczenia
Celem ćwiczenia jest zapoznanie z podstawowym elementem języka C++  klasą.
Wprowadzone są następujące pojęcia: klasa, konstruktor klasy, destruktor klasy, metody
klasy, funkcje zaprzyjaznione z klasą, a także operatory new oraz delete wykorzystywane
do alokacji i usuwania obiektów z pamięci.
Wymienione wyżej pojęcia są zilustrowane na przykładzie klasy implementującej
strukturę danych typu stos.
Wprowadzenie
Celem wprowadzenia pojęcia klasy do języka C++ jest dostarczenie programiście
narzędzia do tworzenia nowych typów, z których można korzystać tak samo wygodnie, jak
z typów wbudowanych do języka. Projektując język C++ przyjęto, że typ zdefiniowany przez
użytkownika nie powinien się różnić od typu wbudowanego sposobem używania, lecz tylko
sposobem tworzenia go.
Deklaracja klasy zawiera jedno z trzech słów kluczowych class, struct lub union
poprzedzających nazwę klasy i następnie deklarację poszczególnych pól danych, metod
(funkcji składowych) klasy i funkcji zaprzyjaznionych z klasą zawartych w nawiasach
klamrowych. Przykładową deklarację klasy pokazuje przykład 1.
Przykład 1
struct abc {
int x;
double *d;
abc();
abc(int ax, double ad);
~abc();
void fun1(void);
int fun2(int x);
int fun2(double x);
};
W przykładzie 1 zadeklarowano klasę o nazwie abc zawierającą dwa pola danych: jedno
typu int, drugie typu double* oraz 6 metod (funkcji składowych):
" abc()  konstruktor 1,
" abc(int, double)  konstruktor 2,
" ~abc()  destruktor,
" void fun1(void)  metoda fun1,
" int fun2(int)  metoda 1. fun2,
" int fun2(double)  metoda 2. fun2,
Metody klasy są funkcjami składowymi klasy, które powinny dostarczać użytkownikowi
interfejsu do operowania na danej klasie. Każda metoda klasy ma dostęp do prywatnych
(priavte) i zastrzeżonych (protected) pól danych i metod danej klasy. Dodatkowo do
każdej metody jest przekazywany jeden argument (oprócz argumentów jawnie
wyspecyfikowanych), będący wskaznikiem do instancji klasy, na rzecz której metoda jest
wywołana. Wskaznik ten jest dostępny wewnątrz każdej metody klasy pod nazwą this.
Dostępność wskaznika this ilustruje przykład 2.
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006 1
JZYK C++  KLASY  POJCIA PODSTAWOWE
Przykład 2
Niech dane będą następujące deklaracje:
class XYZ { // definicja klasy XYZ
.
.
.
void fun1(void);
}
XYZ x1, x2; // deklaracja obiektów x1 i x2
// typu klasa XYZ
Jeżeli w programie pojawi się instrukcja:
x1.fun1();
która wywołuje metodę fun1() na rzecz obiektu x1, to w czasie wykonywania kodu tej
metody wskaznik this wskazuje na obiekt x1 (tzn. zawiera adres obiektu x1).
W przypadku instrukcji:
x2.fun1();
w czasie wykonywania metody fun1() wskaznik ten wskazuje na obiekt x2.
Szczególną rolę pełnią specjalne metody klasy: konstruktor i destruktor.
Konstruktorem(ami) klasy jest metoda o nazwie identycznej z nazwą klasy. Jest ona
wywoływana automatycznie przez kompilator w chwili tworzenia klas (to jest w momencie
napotkania deklaracji zmiennej będącej klasą lub w momencie dynamicznego alokowania
klasy w pamięci za pomocą operatora new) i ma na celu jej zainicjowanie. Konstruktorów
może być kilka, co oznacza, że mogą być przeciążane, przy czym muszą się one między sobą
różnić typami argumentów (podobnie jak funkcje przeciążone). Konstruktor nie może
zwracać żadnej wartości (nawet typu void).
Destruktorem klasy jest metoda o nazwie identycznej z nazwą klasy poprzedzoną
znakiem  ~ . W danej klasie może być tylko jeden destruktor. Musi być on metodą bez
żadnych argumentów i nie może zwracać żadnej wartości (nawet typu void). Destruktor jest
wywoływany automatycznie w chwili usuwania klasy z pamięci (to jest w chwili zakończenia
życia zmiennej (najczęściej przed opuszczeniem funkcji instrukcją return) lub w momencie
usuwania z pamięci zmiennej typu klasa za pomocą operatora delete).
W języku C++ występuje pewna różnica w znaczeniu słów kluczowych struct
i union w stosunku do języka C. W języku C słowa te służą do deklarowania obiektów
przechowujących dane; w języku C++ obiekty te mogą zawierać także metody. W języku
C++ można zdefiniować strukturę (struct) lub unię (union) bez żadnych metod, tworząc
w ten sposób typ lub obiekt identyczny pod względem własności ze strukturą lub unią znaną z
języka C. Użycie słów kluczowych class, struct lub union powoduje w języku C++
ustalenie domyślnych praw dostępu do poszczególnych elementów klasy.
Jeżeli w definicji klasy zostanie użyte słowo kluczowe struct (tak jak w przykładzie
1), wtedy wszystkie elementy klasy (pola danych i metody) są domyślnie dostępne z każdego
2 Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
JZYK C++  KLASY  POJCIA PODSTAWOWE
miejsca programu (w zakresie widzialności danej klasy). Inaczej mówiąc elementy klasy są
publiczne.
Jeżeli w definicji klasy zostanie użyte słowo kluczowe class, wtedy wszystkie
elementy klasy (pola danych i metody) nie są domyślnie dostępne na zewnątrz klasy.
Elementy klasy są dostępne tylko dla metod danej klasy. Inaczej mówiąc elementy klasy są
prywatne.
W celu zmiany praw dostępu do poszczególnych elementów klasy można użyć
następujących słów kluczowych:
" public  powodującego, że wszystkie elementy klasy występujące po tym słowie są
publiczne.
" private  powodującego, że wszystkie elementy klasy występujące po tym słowie
są prywatne.
" protected  powodującego, że wszystkie elementy klasy występujące po tym
słowie są zastrzeżone, co oznacza, że są dostępne dla metod danej klasy i metod klas
pochodnych.
Użycie wyżej wymienionych słów ilustrują przykłady 3 i 4.
Przykład 3
struct abc1 {
int x; // public (domyślnie)
private:
double *d; // private
public:
abc1(); // public
abc1(int ax, double ad); // public
~abc1(); // public
void fun1(void); // public
private:
int fun2(int x); // private
public:
int fun2(double x); // public
};
Przykład 4
class abc2 {
int x; // private (domyślnie)
double *d; // private (domyślnie)
public:
abc2(); // public
abc2(int ax, double ad); // public
~abc2(); // public
void fun1(void); // public
private:
int fun2(int x); // private
public:
int fun2(double x); // public
};
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006 3
JZYK C++  KLASY  POJCIA PODSTAWOWE
Funkcją zaprzyjaznioną z daną klasą jest funkcja nie będąca metodą (funkcją
składową) danej klasy lecz mająca dostęp do prywatnych (private) i zastrzeżonych
(protected) elementów klasy. Funkcję zaprzyjaznione są funkcjami zewnętrznymi dla
klasy. W związku z tym nie mają one dostępu do wskaznika this, dzięki któremu mogłyby
identyfikować obiekt (instancję klasy), na której dana funkcja ma operować. Z tego powodu
najczęściej jednym z argumentów funkcji zaprzyjaznionych jest wskaznik lub referencja do
klasy, na której funkcja ma operować. Funkcja zaprzyjazniona musi być zadeklarowana
wewnątrz klasą, z którą ma być zaprzyjazniona. Jej deklaracja jest poprzedzona słowem
kluczowym friend. Deklarację funkcji zaprzyjaznionej pokazuje przykład 5.
Przykład 5
class abc4 {
int x;
double *d;
public :
abc4();
abc4(int ax, double ad);
~abc4();
void fun1(void);
friend int fun2(abc4 &A, int x);
friend int fun2(abc4 &A, double x);
};
int fun2(abc4 &A, int x)
{
// definicja funkcji
}
int fun2(abc4 &A, double x)
{
// definicja funkcji
}
Do ćwiczenia należy zapoznać się z literatury z następującymi pojęciami:
" klasa, definicja klasy, konstruktor(y) klasy, destruktor klasy, metody klasy,
wskaznik this, dostęp do składowych klasy,
" funkcje zaprzyjaznione,
" operatory new i delete.
Z literatury można polecić następujące książki:
" B. Stroustrup  Język C++ ,
" S. Lipmann  Podstawy języka C++ .
4 Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
JZYK C++  KLASY  POJCIA PODSTAWOWE
Program ćwiczenia
Wstęp
Stos (ang. stack) jest liniową strukturą danych dostępnych do zapisywania
i odczytywania tylko z jednego końca. Z tego powodu stos jest nazywany strukturą typu LIFO
(ang.: Last In First Out). W praktyce stos można zaimplementować za pomocą
jednowymiarowej tablicy s oraz wskaznika stosu sp wskazującego indeks kolejnej wolnej
komórki tablicy. Implementacja taka jest przedstawiona na rysunku 1.
0 1 2 3 4 5 6 . . . . n-3 n-2 n-1
s
sp
Rys. 1. Implementacja stosu
Operacja wprowadzania elementu na stos polega na przypisaniu wartości tego elementu
komórce tablicy s wskazywanej przez wskaznik sp, a następnie na zwiększeniu tego
wskaznika o 1 tak, aby wskazywał on następną wolną komórkę. Implementacja funkcji
wprowadzania na stos nie może dopuścić do przepełnienia stosu tj. zapisywania poza
granicami tablicy.
Pobieranie elementu ze stosu polega na zmniejszeniu wskaznika sp o 1 i odczytaniu
wartości komórki tablicy s wskazywanej przez wskaznik stosu sp. Implementacja funkcji
odczytującej kolejne elementy z wierzchołka stosu nie może zmniejszać wskaznika stosu jeśli
stos jest pusty.
Jeżeli wskaznik stosu ma wartość n  oznacza to, że stos jest pełny.
Jeżeli wskaznik stosu wskazuje element o indeksie 0  oznacza to, że stos jest pusty.
Dany jest następujący szkielet programu:
#include
#include
class Stack {
private:
int *s;
int size, sp;
public:
Stack(int ASize);
Stack(Stack &As);
~Stack();
void push(int Ax);
int pop(void);
int free(void);
int empty(void);
int full(void);
};
/* -------------------------------------------------------- */
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006 5
JZYK C++  KLASY  POJCIA PODSTAWOWE
/*
tutaj należy zdefiniować kostruktory, destruktor i metody
klasy Stack.
*/
/* -------------------------------------------------------- */
main()
{
class Stack ss1(10);
int x, koniec = 0;
char c;
while(!koniec) {
printf("%c STOS(%d) ", ss1.empty() ? 'E' : ss1.full() ?
'F' : ' ', ss1.free());
scanf("%c", &c);
switch(c) {
case '<' : scanf("%d", &x);
ss1.push(x);
break;
case '>' : if(!ss1.empty()) {
x = ss1.pop();
printf("x=%d\n", x);
}
break;
case 'Q' :
case 'q' : koniec = 1;
break;
}
fflush(stdin);
}
return 0;
}
Klasa Stack reprezentuje stos o zadanej wielkości. Poszczególne pola i metody tej
klasy mają mieć następujące zadania:
" int *s;  wskaznik do tablicy przechowującej wartości składowane na stosie,
" int size;  rozmiar stosu,
" int sp;  wskaznik stosu wskazujący kolejną wolną komórkę w tablicy s,
" Stack(int ASize);  konstruktor klasy Stack o zadanej wielkości stosu.
Konstruktor ten musi zaalokować w pamięci tablicę s oraz odpowiednio zainicjować
pozostałe zmienne klasy. Jeżeli wartość argumentu ASize jest niedodatnia to
należy ją przyjąć równą 1.
" Stack(Stack &As);  konstruktor kopiujący. Konstruktor ten służy do
tworzenia klasy identycznej jak podana jako argument. Musi on zaalokować tablicę
s o takiej samej wielkości jak w klasie As i skopiować wartości poszczególnych
pól.
" ~Stack();  destruktor klasy usuwający z pamięci tablicę s.
6 Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
JZYK C++  KLASY  POJCIA PODSTAWOWE
" void push(int Ax);  metoda zapisująca wartość argumentu Ax na
wierzchołek stosu. Należy pamiętać aby nie dopuścić do przepełnienia stosu.
" int pop(void);  metoda zdejmująca element z wierzchołka stosu, jeżeli nie
jest on pusty.
" int free(void);  metoda zwracająca liczbę wolnych komórek na stosie.
" int empty(void);  test czy stos jest pusty. Zwraca wartość różną od 0, jeśli
stos jest pusty.
" int full(void);  test czy stos jest pełny. Zwraca wartość różną od 0, jeśli
stos jest pełny.
W funkcji main() zadeklarowany jest stos ss1 o zadanej wielkości oraz zmienne
pomocnicze x, koniec oraz c. Definicja funkcji main() pozwala na wprowadzanie
i zdejmowanie ze stosu liczb całkowitych.
Program po uruchomieniu zgłasza gotowość znakiem zachęty:
c STOS(n): _
Znak c informuje czy stos jest pusty (litera E), czy pełny (litera F). Jeśli nie jest
wyświetlana ani litera E ani F, oznacza to, że stos nie jest ani pusty ani pełny. Liczba n
informuje o ilości wolnego miejsca na stosie.
W celu wprowadzenia na stos liczby należy wpisać znak < oraz liczbę, którą chcemy
umieścić na stosie i zatwierdzić klawiszem . Na przykład:
< 123 Enter
W celu usunięcia z wierzchołka stosu liczby należy wpisać znak > i zatwierdzić to
klawiszem . Jeżeli stos nie jest pusty liczba zdjęta z wierzchołka stosu będzie
wyświetlona na ekranie. Na przykład:
> Enter
W celu zakończenia pracy z programem należy wpisać literę q lub Q i zatwierdzić
klawiszem .
Zadania do wykonania.
1. Napisać definicje konstruktorów, destruktora oraz zadeklarowanych metod klasy Stack
z uwzględnieniem uwag zawartych we wstępie programu ćwiczenia. Uruchomić tę część
jako program nr 1.
2. Przerobić deklarację klasy Stack i odpowiednie definicje funkcji, aby funkcje push()
i pop() były funkcjami zaprzyjaznionymi z klasą Stack (a nie funkcjami składowymi).
Uruchomić tę część jako program nr 2.
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006 7


Wyszukiwarka

Podobne podstrony:
Drewno klasy drewna
Test ortograficzny dla klasy 3
karta pracy klasy trzeciej nr14 marzec
Program nauczania klasy 4 6 SP (DKW 4014 59?)
karta pracy klasy trzeciej nr20 czerwiec
JP SS 6 Klasy i obiekty
ROZDZIAŁ XII Wyrównanie sieci II klasy
Niedobór ekspresji antygenów MHC klasy II D 84 8
Fizyka klasy 1 3 GIM zadania i ich wyjaśnienia książka pisania przez inżyniera i magistra fizyki
klasy i obiekty cz1 5
KARTKÓWKA LUB ĆWICZENIE DLA KLASY 5 ożywienie i uosobienie
Veblen Thorstein Bunde Teoria klasy prozniaczej
Klasy sprawności silników indukcyjnych(1)
Dyskretny urok klasy robotniczej

więcej podobnych podstron