classes objects c
Krótkie wprowadzenie do klas i obiektów w C ++.
Klasy i obiekty są elementami składowymi programowania obiektowego w C ++. Każda istota, żywa lub nieożywiona, może być reprezentowana jako obiekt i odpowiednio zaprogramowana za pomocą C ++. Tak więc istoty takie jak samochód, biurko, osoba, ptak, zwierzę itd. Mogą być reprezentowane jako obiekty.
Klasa jest poziomem wyższym niż obiekt i reprezentuje kategorię obiektów. W ten sposób klasa działa jak plan, który określa projekt obiektu i szczegóły. Obejmuje to dane używane do opisu obiektu oraz różne metody lub funkcje, które mogą oddziaływać na dane obiektu.
=> Obejrzyj serię prostych szkoleń C ++ tutaj.
W tym samouczku omówimy wszystkie szczegóły klas i obiektów w C ++ wraz z ich programową reprezentacją.
Czego się nauczysz:
- Zajęcia
- Obiekty
- Specyfikatory dostępu
- Konstruktorzy
- Typy konstruktorów
- Operator przypisania
- Niszczyciele
- „Ten” Wskaźnik
- Wniosek
- rekomendowane lektury
Zajęcia
Klasa w C ++ może być postrzegana jako plan lub szkielet konkretnej jednostki. Klasa to typ danych zdefiniowany przez użytkownika. Zawiera ogólne informacje lub dane dotyczące tego konkretnego podmiotu oraz funkcji, które na nim działają.
W składni C ++ definiujemy klasę za pomocą słowa kluczowego „class”, po którym następuje nazwa klasy.
Po nazwie klasy znajdują się szczegóły dotyczące klasy ujęte w nawiasy klamrowe i zakończone średnikiem.
Poniższy blok przedstawia ogólną składnię definicji klasy.
Jak pokazano na powyższej reprezentacji, klasa może mieć specyfikatory dostępu, takie jak public / protected / private. Może mieć członków danych i funkcje składowe. Dane i funkcje są nazywane członkami klasy. Domyślnie członkowie są prywatni dla klasy, więc żadna zewnętrzna jednostka nie ma do nich dostępu.
Na przykład, pojazd może być klasą uogólnioną mającą takie właściwości, jak model, kolor, nr podwozia, prędkość_średnia itp. Może mieć funkcje takie jak zmianaModel, przyspieszenie, spowolnienie itp., które wykonują działania na elementach danych. Możemy zdefiniować klasę o nazwie „pojazd”, która będzie zawierała wszystkie te elementy i funkcje danych.
Jak już wspomniano, klasa jest tylko planem dla jednostek. Po zdefiniowaniu nie zajmuje miejsca w pamięci. Aby klasa była funkcjonalna, musimy zdefiniować obiekty, które mogą korzystać z jej członków.
Obiekty
Aby skorzystać z funkcjonalności klasy, musimy utworzyć instancję klasy w celu utworzenia obiektu. Obiekt jest instancją klasy. W prostych słowach możemy powiedzieć, że obiekt jest zmienną klasy typu.
Ogólna składnia tworzenia obiektu to:
classname object_name;
Po utworzeniu obiektu można go użyć do uzyskania dostępu do elementów członkowskich danych i funkcji tej klasy.
Dostęp do elementów członkowskich klasy (danych i funkcji) odbywa się za pomocą operatora kropki (.), Który jest również nazywany operatorem dostępu do elementu członkowskiego.
Jeśli obj to nazwa obiektu, aw klasie znajduje się funkcja „display ()”, wówczas dostęp do tej funkcji można uzyskać jako „obj.display ()”.
W powyższym stwierdzeniu jest jednak pewien haczyk. Możemy uzyskać dostęp do funkcji display () za pomocą obiektu i operatora kropki, jeśli funkcja jest „publiczna”.
Specyfikatory dostępu
W C ++ dostęp do elementów członkowskich danych i funkcji w klasie zależy od dostępu przyznanego temu konkretnemu elementowi lub funkcji danych za pomocą specyfikatora dostępu.
C ++ obsługuje następujące specyfikatory dostępu:
# 1) Prywatne
To jest domyślny specyfikator dostępu dla klasy w C ++. Oznacza to, że jeśli nie określono specyfikatora dostępu dla elementów członkowskich w klasie, jest on traktowany jako prywatny.
Gdy członek jest prywatny, nie można uzyskać do niego dostępu poza zajęciami. Nawet nie używając obiektu i operatora kropki. Dostęp do prywatnych członków danych można uzyskać tylko za pomocą funkcji składowych klasy.
sql queries rozmowy kwalifikacyjne i odpowiedzi na 3 lata doświadczenia
Istnieje jednak wyjątek od tej reguły, który omówimy w naszych dalszych tematach.
# 2) Publiczne
Składnik danych lub funkcja zdefiniowana jako publiczna w klasie jest dostępna dla wszystkich poza klasą. Dostęp do tych elementów członkowskich można uzyskać za pomocą obiektu i operatora kropki.
# 3) Chroniony
Chroniony element członkowski klasy jest dostępny dla samej klasy i klas podrzędnych tej klasy.
Ten specyfikator dostępu jest szczególnie używany w przypadku dziedziczenia i omówimy to szczegółowo podczas omawiania tematu dziedziczenia.
Weźmy następujący przykład, aby lepiej zrozumieć te specyfikatory dostępu.
#include #include using namespace std; class ABC{ int var1 = 10; public: string name; void display() { cout<<'var1 ='< Wynik:
var1 = 10
name = sth
W tym programie mamy dwa elementy składowe danych, z których zmienna1 typu int jest prywatna (specyfikator dostępu nie został określony. Wartość domyślna jest prywatna). Kolejnym składnikiem jest nazwa ciągu, która jest zadeklarowana jako publiczna. Mamy jeszcze inny ekran funkcji, który wyświetla wartość obu tych elementów członkowskich.
W funkcji main deklarujemy obiekt abc klasy ABC. Następnie ustawiamy wartości członkom danych, a także wyświetlamy funkcję wywołania za pomocą obiektu „abc”.
Jednak gdy kompilator napotka linię abc.var1 = 20; wygeneruje błąd, że „zmienna1 jest zmienną prywatną”.
Dzieje się tak, ponieważ nie możemy uzyskać dostępu do prywatnych danych członków klasy poza klasą. Tak więc jest błąd. Ale możemy uzyskać do niego dostęp wewnątrz funkcji, a zatem kiedy wyprowadzamy wartość var1 w funkcji display; nie powoduje żadnego błędu.
W związku z tym wyjście programu wyświetla wartość początkową, z którą zadeklarowano zmienną1.
Do tej pory widzieliśmy szczegóły dotyczące klas, obiektów i specyfikatorów dostępu, a teraz weźmy pełny przykład przykładowego ucznia klasy. Ta klasa ma członków danych: student_id, student_name i student_age. Posiada również funkcje członkowskie do odczytywania informacji o studentach i wyświetlania informacji o studentach.
W celu ułatwienia czytelnikom zadeklarowaliśmy wszystkich członków klasy jako publicznych.
Poniższy program przedstawia pełną realizację.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; void read_studentInfo(); void print_studentInfo() { cout<<'
Student ID : '<student_id; cout<>student_name; cout<>student_age; } int main() { student s1; s1.read_studentInfo(); s1.print_studentInfo(); }
Wynik:
Wprowadź identyfikator ucznia: 1
Wpisz nazwisko_ ucznia: abc
Wpisz student_age: 12
Identyfikator studenta: 1
Nazwisko ucznia: abc
Wiek ucznia: 12
Zatem mamy pełną klasę zdefiniowaną powyżej. Jedyną zauważalną różnicą jest to, że zdefiniowaliśmy jedną funkcję „print_studentInfo” wewnątrz klasy, podczas gdy inna funkcja „read_studentinfo” jest zdefiniowana poza klasą. Są to dwa sposoby definiowania funkcji składowych dla klasy.
Zauważ, że funkcja zdefiniowana na zewnątrz nadal ma deklarację / prototyp wewnątrz klasy. Ponadto jest definiowany poza klasą przy użyciu rozszerzenia operator rozpoznawania zakresu (: :) . Następnie w funkcji głównej tworzymy obiekt klasy studenta, a następnie wywołujemy funkcje w celu odczytania i wyświetlenia danych.
Konstruktorzy
Do tej pory w tym samouczku utworzyliśmy prosty obiekt, a następnie przypisujemy wartości do każdego elementu członkowskiego klasy w funkcji głównej po odczytaniu tych wartości ze standardowego wejścia.
W tym temacie przyjrzymy się specjalnej funkcji, która jest używana do inicjalizacji obiektu podczas jego tworzenia. Ta specjalna funkcja nazywana jest konstruktorem.
Konstruktor jest funkcją składową klasy, ale różni się od zwykłej funkcji składowej w następujący sposób:
- Konstruktor nie zwraca wartości, tj. Konstruktor nigdy nie zwraca wartości.
- Jest to publiczna funkcja członkowska klasy.
- Służy do inicjowania elementów członkowskich danych i konstruowania obiektu klasy.
- Jest on automatycznie wywoływany przez kompilator podczas tworzenia obiektu.
Typy konstruktorów
C ++ obsługuje następujące typy konstruktorów.
# 1) Domyślny konstruktor
Konstruktor domyślny jest konstruktorem podstawowym i nie ma parametrów. Możemy stworzyć prosty obiekt bez żadnych parametrów używając domyślnego konstruktora.
Domyślny konstruktor ma następującą składnię:
classname() { //constructor code }
Jeśli klasa nie ma domyślnego konstruktora, kompilator ją tworzy.
# 2) Sparametryzowany konstruktor
Konstruktor sparametryzowany to taki, który ma listę parametrów, za pomocą której możemy zainicjować składowe klasy. Kiedy deklarujemy obiekt w konstruktorze sparametryzowanym, musimy przekazać wartości początkowe do funkcji konstruktora jako parametry.
Sparametryzowana funkcja konstruktora wygląda tak, jak pokazano poniżej.
classname(argument list){ //constructor code }
Konstruktor sparametryzowany służy do przeciążania konstruktorów. Więcej o przeciążaniu dowiemy się w naszych dalszych tematach.
Konstruktor sparametryzowany służy do inicjowania elementów składowych danych różnych obiektów. Robiąc to, możemy przekazywać różne wartości członków danych do różnych obiektów.
# 3) Kopiuj konstruktory
C ++ obsługuje trzeci typ konstruktora, znany jako konstruktor kopiujący. Jego ogólna forma to
nazwa klasy (const nazwa klasy & obj);
Jak pokazano w powyższej deklaracji, w konstruktorze kopiującym nowy obiekt tworzony jest z wartości innego obiektu tej samej klasy. Parametr przekazywany do konstruktora jest stałym odwołaniem do obiektu, którego wartości zostaną użyte do budowy nowego obiektu.
Konstruktor kopiujący jest zwykle wywoływany w następujących sytuacjach:
- Gdy obiekt klasy jest zwracany przez wartość.
- Gdy obiekt jest przekazywany do funkcji jako argument i jest przekazywany przez wartość.
- Gdy obiekt jest zbudowany z innego obiektu tej samej klasy.
- Gdy kompilator generuje obiekt tymczasowy.
Jednak nie możemy zagwarantować, że konstruktor kopiujący z pewnością zostanie wywołany we wszystkich powyższych przypadkach, ponieważ kompilator C ++ ma sposób na optymalizację operacji kopiowania.
Konstruktor kopiujący wykonuje składową kopię między obiektami. Podobnie jak domyślny konstruktor, kompilator C ++ tworzy domyślny konstruktor kopiujący, jeśli nie dostarczamy go w naszym programie. Ale kiedy klasa ma określone elementy składowe danych, takie jak wskaźniki, odwołania lub alokacja zasobów w czasie wykonywania, musimy mieć własny konstruktor kopiujący zdefiniowany przez użytkownika.
najlepsze oprogramowanie do odzyskiwania dla systemu Windows 10
Powodem jest to, że domyślny konstruktor kopiujący wykonuje tylko płytką kopię składowych danych, tj. Oba obiekty będą współdzielić tę samą lokalizację pamięci. Jest to dobre dla prostych członków danych niebędących wskaźnikami.
Jednak jeśli chodzi o wskaźniki lub inne dynamiczne elementy składowe danych, chcielibyśmy, aby dane były skierowane do nowej lokalizacji pamięci. To jest głęboka kopia i można ją osiągnąć tylko za pomocą konstruktora kopiującego zdefiniowanego przez użytkownika.
Poniżej podano kompletny program w C ++, który implementuje wszystkie trzy typy konstruktorów i ich użycie w konstruowaniu obiektu.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; //default constructor student(){ student_id = 1; student_name = 'abc'; student_age = 10; } //parameterized constructor student(int id,string name,int age){ student_id = id; student_name = name; student_age = age; } //copy constructor student(const student& st){ student_id = st.student_id; student_name = st.student_name; student_age = st.student_age; } void print_studentInfo() { cout<<'
Student ID : '< Wynik:
********** s **********
Identyfikator studenta: 1
Nazwisko ucznia: abc
Wiek ucznia: 10
********** s2 **********
Identyfikator studenta: 2
Nazwisko ucznia: xyz
Wiek ucznia: 12
Zrzut ekranu tego samego znajduje się poniżej.
W tym programie zdefiniowaliśmy ucznia klasowego, który jest podobny do zdefiniowanego w poprzednim programie. Różnica polega na tym, że zamiast odczytywać wartości składowych danych ze standardowego wejścia za pomocą funkcji, definiujemy trzy konstruktory.
Klasa może mieć więcej niż jednego konstruktora. Mamy domyślny konstruktor, który inicjuje elementy członkowskie danych do wartości początkowych. Następnie definiujemy sparametryzowany konstruktor, który przekazuje wartości początkowe jako parametry do konstruktora.
Następnie definiujemy konstruktor kopiujący, do którego przekazujemy stałe odwołanie do obiektu klasy studenta.
W funkcji głównej tworzymy osobno trzy obiekty za pomocą trzech konstruktorów. Pierwszy obiekt s tworzony jest przy użyciu domyślnego konstruktora. Drugi obiekt s1 jest tworzony za pomocą sparametryzowanego konstruktora, podczas gdy trzeci obiekt s2 jest tworzony za pomocą konstruktora kopiującego.
Zwróć uwagę na utworzenie trzeciego obiektu s2. Tutaj przypisujemy już utworzony obiekt s1 do nowego obiektu s2. Zatem, kiedy konstruujemy nowy obiekt przy użyciu już istniejącego obiektu, kompilator wywołuje konstruktor kopiujący.
Operator przypisania
Możemy również przypisać wartości jednego obiektu do innego za pomocą operatora przypisania (=). W tym przypadku otrzymamy instrukcję taką jak s1 = s.
Różnica między konstruktorem kopiującym a operatorem przypisania polega na tym, że podczas gdy konstruktor kopiujący tworzy całkowicie nowy obiekt, operator przypisania po prostu przypisuje wartości elementu członkowskiego obiektu po prawej stronie do wartości obiektu po lewej stronie. Oznacza to, że obiekty po obu stronach operatora przypisania muszą istnieć przed przypisaniem.
Niszczyciele
Destruktor jest również funkcją specjalną, taką jak konstruktor, ale implementuje funkcjonalność dokładnie odwrotną do konstruktora. Podczas gdy konstruktor służy do tworzenia obiektu, destruktor służy do niszczenia lub usuwania obiektu.
Oto niektóre cechy destruktora:
- Nazwa destruktora jest taka sama jak nazwa klasy, ale zaczyna się od znaku tyldy (~).
- Destructor nie ma typu zwracanego.
- Destruktor nie ma argumentów.
- W klasie może być tylko jeden destruktor.
- Kompilator zawsze tworzy domyślny destruktor, jeśli nie dostarczymy go dla klasy.
Ogólna składnia destruktora to:
~classname(){ //cleanup code }
Destruktor klasy jest zwykle wywoływany w następujących sytuacjach:
- Gdy obiekt wyjdzie z zakresu, automatycznie wywoływany jest destruktor klasy.
- Podobnie, destruktor jest wywoływany, gdy program kończy wykonywanie. Oznacza to, że wszystkie obiekty również przestają istnieć. W związku z tym zostanie wywołany destruktor każdego obiektu.
- Destruktor klasy jest również wywoływany, gdy wykonywany jest operator „delete” służący do usunięcia obiektu.
- Możemy również jawnie wywołać destruktor w celu wykonania czynności porządkowych po zakończeniu działania obiektu.
Poniższy przykład ilustruje działanie destruktora.
#include using namespace std; class sample{ public: sample(){ cout<<'Constructor::sample called'< Wynik:
Constructor :: sample o nazwie
To jest przykładowa klasa
Destructor :: ~ sample o nazwie
Zrzut ekranu dla powyższego wyniku znajduje się poniżej.
Zdefiniowaliśmy przykładową klasę, w której zdefiniowaliśmy konstruktor, destruktor i wyświetlanie funkcji. W funkcji main tworzymy obiekt obj klasy sample, a następnie wywołujemy funkcję display na tym obiekcie.
Następnie wykonywany jest powrót 0. Na wyjściu widzimy, że w momencie, gdy funkcja display powraca i sterowanie programu dochodzi do instrukcji return 0, destruktor jest wykonywany. Oznacza to, że jest wykonywany w momencie, gdy obiekt wyjdzie poza zakres.
„Ten” Wskaźnik
C ++ używa specjalnej koncepcji związanej z obiektami, znanej jako wskaźnik „ten”. Wskaźnik „this” zawsze wskazuje na bieżący obiekt. Dlatego w zależności od sytuacji, gdy mamy odwołać się do aktualnego obiektu, używamy wskaźnika „this”.
Wiemy, że za każdym razem, gdy tworzona jest instancja klasy, czyli obiekt, dla obiektu tworzona jest osobna kopia danych składowych klasy. Ale jeśli chodzi o funkcje składowe klasy, wszystkie obiekty mają tę samą kopię.
Jeśli więc jeden lub więcej obiektów jednocześnie uzyskuje dostęp do funkcji składowych, w jaki sposób możemy zapewnić, że odpowiednie elementy członkowskie są dostępne i modyfikowane przez funkcje składowe?
To jest miejsce, w którym „ten” wskaźnik zaczyna działać. Kompilator przekazuje niejawny wskaźnik z nazwą funkcji jako „this”. Nazywa się to wskaźnikiem „ten”.
Wskaźnik „this” jest przekazywany jako ukryty argument do wszystkich wywołań funkcji składowych. Zwykle jest to zmienna lokalna. Stąd „ten” wskaźnik jest wskaźnikiem stałym, a jego zawartością jest adres pamięci aktualnego obiektu.
Należy zauważyć, że ten wskaźnik jest dostępny tylko dla niestatycznych funkcji składowych, a nie dla funkcji statycznych. Dzieje się tak, ponieważ dostęp do funkcji statycznych nie jest wymagany przy użyciu obiektu. Dostęp do nich można uzyskać bezpośrednio, używając nazwy klasy.
Zwykle używamy wskaźnika „this” w sytuacjach, gdy zmienne składowe i parametry są przekazywane w celu zainicjowania zmiennych składowych o tej samej nazwie. Używamy go również, gdy musimy zwrócić bieżący obiekt z funkcji.
jaki pomysł użyć dla Pythona
Zobaczmy poniżej demonstrację wskaźnika „ten”.
#include using namespace std; class Sample { private: int num; char ch; public: Sample &setParam(int num, char ch){ this->num =num; this->ch = ch; return *this; } void printValues(){ cout<<'num = '< Wynik:
num = 100
ch = A
W powyższym programie mamy klasę o nazwie Sample, z dwoma członami danych num i ch. Mamy funkcję składową setParam, która przekazuje parametry o tych samych nazwach, num i ch, aby ustawić wartości zmiennych składowych.
Wewnątrz funkcji przypisujemy te wartości do aktualnych zmiennych składowych obiektu wskazanych przez ten wskaźnik. Po ustawieniu wartości bieżący obiekt „this” jest zwracany z funkcji.
W funkcji głównej najpierw tworzymy obiekt klasy Sample, obj i wywołujemy funkcję setParam w celu ustawienia wartości, a następnie wywołujemy funkcję printValues w celu wydrukowania wartości.
Wniosek
Nauczyliśmy się podstawowych elementów konstrukcyjnych OOP w C ++ w tym samouczku. Zrozumienie klas i obiektów to podstawowe wymagania, na początek, OOP w C ++. Dowiedzieliśmy się również szczegółowo o konstruktorach i destruktorach wraz z przykładami.
W naszym nadchodzącym samouczku dowiemy się o listach inicjatorów w C ++.
=> Obejrzyj serię prostych szkoleń C ++ tutaj.
rekomendowane lektury
- Pojęcia dotyczące OOP w języku Python (klasy, obiekty i dziedziczenie w Pythonie)
- Interfejs Java i samouczek klasy abstrakcyjnej z przykładami
- Praca z obiektami VBScript Excel
- Samouczek QTP nr 7 - Paradygmat identyfikacji obiektów QTP - Jak QTP jednoznacznie identyfikuje obiekty?
- Repozytorium obiektów w QTP - samouczek nr 22
- Praca z obiektami połączeń VBScript ADODB
- Polimorfizm środowiska uruchomieniowego w C ++
- Dziedziczenie w C ++