Jak zbudowana jest klasa w C++
Klasa w bardzo dużym uogólnieniu przypomina definicję struktury. Jej zapis wygląda następująco: C/C++class NazwaTwojejKlasy { //w tym miejscu piszemy definicje typów, zmienne i funkcje jakie mają należeć do klasy. }; //tutaj średnik jest bardzo ważny!
Prawa dostępu do klasy
class TwojaKlasa { int abc; }; int main() { TwojaKlasa nazwaZmiennej; nazwaZmiennej.abc = 10; return( 0 ); }
Słowa kluczowe private, protected, public
C++ umożliwia łatwe modyfikowanie praw dostępu do wybranych zmiennych i funkcji klasy. Służą do tego trzy słowa kluczowe: private, protected i public.Słowo kluczowe private
Słowo kluczowe private oznacza dostęp do zmiennych i funkcji tylko z poziomu klasy. Nie są one widoczne poza klasą, więc użytkownik klasy nie będzie mógł uzyskać dostępu do zmiennej (lub funkcji) spoza klasy.Słowo kluczowe protected
Słowo kluczowe protected ma takie same własności co słowo kluczowe private. Różnice pojawiają się tylko wtedy, gdy przyjdzie nam dziedziczyć klasy. Jeśli będziemy dziedziczyli klasę A do klasy B to zmienne oznaczone jako private w klasie A będą niewidoczne dla klasy B. Jeśli zmienne (i funkcje) klasy A będą miały prawo dostępu protected to takie zmienne (i funkcje) będą widoczne dla klasy B.Słowo kluczowe public
Dostęp publiczny umożliwia uzyskiwanie dostępu do dowolnej zmiennej i funkcji z dowolnego miejsca w kodzie (jeśli oczywiście zachowana jest logika programowania w C++).Jak się zmienia prawa dostępu w praktyce
Ustawianie praw dostępu jest bardzo prostą czynnością. Najprościej będzie to pokazać na przykładzie.#include <string> class TwojaKlasa { public: double liczba; //prawo dostępu: publiczne char tablica[ 20 ]; //prawo dostępu: publiczne private: int abc; //prawo dostępu: prytatne char znak; //prawo dostępu: prytatne std::string napis; //prawo dostępu: prytatne }; int main() { TwojaKlasa nazwaZmiennej; return( 0 ); }
Deklaracja funkcji wewnątrz klasy
Pierwszą, a zarazem najprostszą metodą na utworzenie funkcji w klasie jest napisanie jej wewnątrz klasy. Przykład:#include <cstdlib> #include <iostream> using namespace std; class EksperymentCL { private: int TwojaPrywatnaFunkcja( int a, int b ) { return( a - b + 2 ); } public: int TwojaPublicznaFunkcja( int a, int b ) { return(( a + b ) * 2 ); } }; int main() { EksperymentCL nazwaZmiennej; cout << nazwaZmiennej.TwojaPublicznaFunkcja(1,2) << endl; system("PAUSE"); return EXIT_SUCCESS; }Funkcje, które zostały zadeklarowane jako publiczne, będą mogły być wywoływane spoza klasy. Funkcje prywatne mogą być wywołane tylko i wyłącznie wewnątrz klasy (we wszystkich funkcjach należących do klasy). Tworzenie funkcji prywatnych jest bardzo wygodne, ponieważ umożliwia nam dzielenie skomplikowanej, zazwyczaj publicznej funkcji na mniejsze elementy, które przy późniejszej analizie i nanoszeniu ewentualnych poprawek sprawia dużo mniej kłopotów niż modyfikacja jednego długiego kodu funkcji.
Definicja funkcji wewnątrz klasy, deklaracja poza klasą
Pierwsza metoda, która została przedstawiona jest bardzo wygodna w użyciu, jednak ma takie same minusy jakie miały funkcje pisane w bloku głównym - kompilator nie widzi funkcji, które są 'wyżej'. Jeśli więc chcielibyśmy wywołać z funkcji TwojaPrywatnaFunkcja(), funkcję TwojaPublicznaFunkcja () to kompilator wyrzuciłby nam błąd. Drugą wadą jest to, że czytelność kodu bardzo się obniża przez to, że nie widać czy dana funkcja należy do klasy czy też nie (nie wspominając o zmiennych). Aby temu zaradzić, ten sam kod co poprzednio można zapisać następująco:#include <cstdlib> #include <iostream> using namespace std; class EksperymentCL { private: int TwojaPrywatnaFunkcja( int a, int b ); public: int TwojaPublicznaFunkcja( int a, int b ); }; int EksperymentCL::TwojaPrywatnaFunkcja( int a, int b ) { return( a - b + 2 ); } int EksperymentCL::TwojaPublicznaFunkcja( int a, int b ) { return(( a + b ) * 2 ); } int main() { EksperymentCL nazwaZmiennej; cout << nazwaZmiennej.TwojaPublicznaFunkcja(1,2) << endl; system("PAUSE"); return EXIT_SUCCESS; }
Konstruktor klasy
Konstruktor jest specyficzną funkcją, która jest wywoływana zawsze gdy tworzony jest obiekt. Jeśli programista nie utworzy konstruktora dla klasy, kompilator automatycznie utworzy konstruktor, który nic nie będzie robił. Konstruktor nie pojawi się nigdzie w kodzie, jednak będzie on istniał w skompilowanej wersji programu i będzie wywoływany za każdym razem, gdy będzie tworzony obiekt klasy. Jeśli chcemy zmienić domyślne własności konstruktora jaki jest tworzony przez kompilator C++ wystarczy, że utworzymy własny konstruktor dla klasy. Poniższy przykład pokazuje jak zapisuje się konstruktor dla klasy.#include <cstdlib> #include <iostream> #include <string> using namespace std; class NazwaTwojejKlasy { public: NazwaTwojejKlasy(); //To jest definicja konstruktora }; NazwaTwojejKlasy::NazwaTwojejKlasy() { //Tu inicjujemy wartości zmiennych klasy }Pierwsze co rzuca się w oczy w przypadku konstruktora, to brak zwracanego typu danych. Druga istotna własność konstruktora to jego nazwa. Konstruktor musi nazywać się tak samo jak nazwa klasy. Konstruktorom możesz przekazywać parametry tak samo jak funkcjom. C++ umożliwia również tworzenie kilku konstruktorów dla jednej klasy (muszą się one jednak różnić parametrami wejściowymi tak jak w przypadku funkcji).
#include <cstdlib> #include <iostream> #include <string> using namespace std; class JakasKlasa { int a; char b; std::string c; public: JakasKlasa(int a, char b, string c){ a = a; b = b; c = c; } }; int main() { int a =2; JakasKlasa klas1(2,'x',"asd"); system("PAUSE"); return EXIT_SUCCESS; }
Lista inicjalizacyjna
#include <cstdlib> #include <iostream> #include <string> using namespace std; class JakasKlasa { int a; char b; string c; public: JakasKlasa(int a, char b, string c) : a(a) , b(b) , c(c) { } }; int main() { int a =2; JakasKlasa klas1(2,'x',"asd"); system("PAUSE"); return EXIT_SUCCESS; }
Funkcje
#include <cstdlib> #include <iostream> #include <string> using namespace std; class JakasKlasa { int a; char b; string c; public: JakasKlasa(int a, char b, string c):a(a),b(b),c(c){} void print(){ cout <<a<<endl; cout<<b<<endl; cout<<c<<endl; } }; int main() { int a =2; JakasKlasa klas1(2,'x',"asd"); klas1.print(); system("PAUSE"); return EXIT_SUCCESS; }
Zadania
Zad. 1. (1 punkt)
W kodzie:#includeusing namespace std; class I_6{ private: int i_1; int i_2; int i_3; int i_4; int i_5; int i_6; public: I_6(int i_1, int i_2, int i_3, int i_4, int i_5, int i_6){ //*1 //*1 } void write(){ //*2 //*2 } }; int main() { I_6 i = I_6(1,2,3,4,5,6); i.write(); system("PAUSE"); return EXIT_SUCCESS; }
-
pomiędzy liniami za komentowanymi:
//*1 //*1
dodaj inicjalizację kolejnych obiektów klasy. -
pomiędzy liniami za komentowanymi:
//*2 //*2
dodaj implementacje pozwalająca wypisanie zmiennych.
1 2 3 4 5 6
Zad. 2. (1 punkt)
W programie#includedo funkcji main nadaj zmiennej i oraz j wartość 1 i wypisz je.using namespace std; class zmienne{ public: int i; int j; }; int main() { system("PAUSE"); return EXIT_SUCCESS; }
Zad. 3. (2 punkt)
Proszę napisać klasę „Complex” liczb zespolonych.-
Konstruktor klasy powinien być
zdefiniowany z parametrami a, b typu rzeczywistego umożliwiającymi nadanie
egzemplarzowi klasy wartości np. -6.4+7.8i.
Jeżeli podamy jeden argument ma zostać stworzona liczba a+0i - Zdefiniować metodę toStr, która wypisuje liczbę zespoloną w postaci a+bi.
- Napisać metodę liczącą moduł a+bi.
- Napisać metodę liczącą argument a+bi.
Zad. 4. (2 punkt)
Proszę napisać klasę „osoba” .-
obiektami klasy mają być:
-
char imie[20] char nazwisko[20] int wiek int pesel
-
- Dodaj konstruktor.
- Zdefiniować metodę write, która wypisuje dane osoby.
-
Zdefiniuj funkcje
zmien_imie zmien_nazwisko zmien_wiek zmien_pesel