C++ Klasa i objekt s primjerom

โšก Pametni saลพetak

Klase i objekti u C++ ฤine temelj objektno orijentiranog programiranja, gdje klasa definira nacrt podataka i funkcija ฤlanica, a objekt je konkretna instanca stvorena iz tog nacrta.

  • ๐Ÿ”ท Nacrt razreda: A C++ Klasa objedinjuje podatkovne ฤlanove i funkcije ฤlanova u jedan korisniฤki definirani tip.
  • ๐Ÿ”‘ Modifikatori pristupa: Kljuฤne rijeฤi private, public i protected kontroliraju gdje se ฤlanovima klase moลพe pristupiti.
  • ๐Ÿงฑ Instanciranje objekta: Objekt se stvara iz klase pomoฤ‡u sintakse naziv-klase naziv-objekta.
  • ???? Pristup za ฤlanove: Operator toฤka dopire do javnih ฤlanova, dok funkcije ฤlanova manipuliraju pohranjenim podacima.
  • ๏ธ Konstruktori: Konstruktori automatski inicijaliziraju objekte, a destruktori ih oslobaฤ‘aju kada izaฤ‘u izvan dosega.
  • ๐Ÿค– AI pomoฤ‡: GitHub Copilot i sliฤni AI asistenti grade definicije klasa i konstruktore iz kratkog komentara.

C++ Klasa i objekt

ล to je klasa?

A C++ klasa kombinira podatke i metode za manipuliranje podacima u jednu. Klase takoฤ‘er odreฤ‘uju oblike objekata. Podaci i metode sadrลพani u klasi poznati su kao ฤlanovi klase. Klasa je tip podataka koji definira korisnik. Za pristup ฤlanovima klase koristimo instancu klase. Moลพete vidjeti klasu kao nacrt za objekt.

Klasa moลพe biti prototip kuฤ‡e. Prikazuje poloลพaj i veliฤine vrata, prozora, podova itd. Iz tih opisa moลพemo konstruirati kuฤ‡u. Kuฤ‡a postaje objekt. Moguฤ‡e je stvoriti mnogo kuฤ‡a iz prototipa. Takoฤ‘er, moguฤ‡e je stvoriti mnogo objekata iz klase.

C++ razred kao nacrt za objekte

Na gornjoj slici imamo prototip jedne kuฤ‡e. Od ovog prototipa stvorili smo dvije kuฤ‡e s razliฤitim znaฤajkama.

Imajuฤ‡i na umu ideju klase kao nacrta, sljedeฤ‡i korak je vidjeti kako se ona deklarira u kodu.

Klasna deklaracija

In C++, klasa se definira pomoฤ‡u kljuฤne rijeฤi class. Nakon toga treba slijediti naziv klase. Tijelo klase se zatim dodaje izmeฤ‘u vitiฤastih zagrada { }.

Sintaksa

class class-name
   {
   // data
   // functions
   };
  • The naziv-klase je ime koje treba dodijeliti klasi.
  • The datum su podaci za klasu, obiฤno deklarirani kao varijable.
  • The Funkcije su funkcije klase.

Deklarisanje imena i tijela klase prirodno postavlja pitanje tko smije koristiti svaki ฤlan.

Privatne i javne kljuฤne rijeฤi

Sigurno ste naiลกli na ove dvije kljuฤne rijeฤi. Oni su modifikatori pristupa.

Smjeลกtaj kod:

Kada se kljuฤna rijeฤ private koristi za definiranje funkcije ili klase, ona postaje privatna. Takvi su dostupni samo iz klase.

Javnost:

Kljuฤna rijeฤ public, s druge strane, ฤini podatke/funkcije javnima. Njima se moลพe pristupiti izvan razreda.

Nakon ลกto klasa postoji, objekti se mogu kreirati iz nje, sliฤno kao ลกto se varijable kreiraju iz tipa podataka.

Definicija objekta

Objekti se stvaraju iz klasa. Objekti klase se deklariraju na sliฤan naฤin kao ลกto se deklariraju varijable. Ime klase mora biti prvo, a zatim ime objekta. Objekt je tipa klase.

Sintaksa

class-name object-name;
  • The naziv-klase je naziv klase iz koje se ลพeli stvoriti objekt.
  • The naziv-objekta je ime koje ฤ‡e se dodijeliti novom objektu.

Ovaj proces stvaranja objekta iz klase poznat je kao instanciranje.

Nakon ลกto je objekt kreiran, njegovim javnim ฤlanovima moลพe se pristupiti izravno putem jednostavnog operatora.

Pristup ฤlanovima podataka

Za pristup javnim ฤlanovima klase koristimo operator (.)dot. Ovo su ฤlanovi oznaฤeni modifikatorom javnog pristupa.

Primjer 1

#include <iostream>
using namespace std;
class Phone {
public:
	double cost;   
	int slots; 
};
int main() {
	Phone Y6;        
	Phone Y7;        

	Y6.cost = 100.0;
	Y6.slots = 2;

	Y7.cost = 200.0;
	Y7.slots = 2;
	cout << "Cost of Huawei Y6 : " << Y6.cost << endl;
	cout << "Cost of Huawei Y7 : " << Y7.cost << endl;

	cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl;
	cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl;

	return 0;
}

Izlaz:

C++ pristup javnim ฤlanovima podataka Primjer 1 izlaz

Evo snimke zaslona koda:

C++ pristup javnim ฤlanovima podataka Primjer 1 koda

Code Objaลกnjenje:

  1. Ukljuฤite iostream datoteku zaglavlja u naลก kod kako biste koristili njezine funkcije.
  2. Ukljuฤivanje std imenskog prostora u naลก kod za koriลกtenje njegovih klasa bez pozivanja.
  3. Deklarirajte klasu pod nazivom Phone.
  4. Koriลกtenje modifikatora javnog pristupa za oznaฤavanje varijabli koje ฤ‡emo izraditi kao javno dostupnih.
  5. Deklarirajte varijabilni troลกak dvostrukog tipa podataka.
  6. Deklarirajte cjelobrojnu varijablu pod nazivom slots.
  7. Kraj tijela razreda.
  8. Pozivanje glavne () funkcije. Programsku logiku treba dodati unutar njegovog tijela.
  9. Kreirajte objekt pod nazivom Y6 tipa Phone. To se zove instanciranje.
  10. Kreirajte objekt pod nazivom Y7 tipa Phone. To se zove instanciranje.
  11. Pristup varijabli/ฤlanskom troลกku klase Phone pomoฤ‡u objekta Y6. Vrijednost je postavljena na 100.0. Cijena Y6 sada je postavljena na 100.0.
  12. Pristupite utorima za varijable/ฤlanove klase Phone pomoฤ‡u objekta Y6. Vrijednost je postavljena na 2. Utori za Y6 sada su postavljeni na 2.
  13. Pristup varijabli/ฤlanskom troลกku klase Phone pomoฤ‡u objekta Y7. Vrijednost je postavljena na 200.0. Cijena Y7 sada je postavljena na 200.0.
  14. Pristupite utorima za varijable/ฤlanove klase Phone pomoฤ‡u objekta Y7. Vrijednost je postavljena na 2. Utori za Y7 sada su postavljeni na 2.
  15. Ispiลกite cijenu Y6 na konzoli uz ostali tekst.
  16. Ispiลกite cijenu Y7 na konzoli uz ostali tekst.
  17. Ispiลกite broj utora za Y6 uz ostali tekst.
  18. Ispiลกite broj utora za Y7 uz ostali tekst.
  19. Program mora vratiti vrijednost nakon uspjeลกnog zavrลกetka.
  20. Kraj tijela funkcije main().

Javni ฤlanovi su otvoreni za vanjski kod, ali privatni ฤlanovi slijede mnogo stroลพa pravila pristupa.

ล to je privatni teฤaj?

ฤŒlanovima klase oznaฤenim kao privatnima moลพe se pristupiti samo pomoฤ‡u funkcija definiranih unutar klase. Bilo koji objekt ili funkcija definirana izvan klase ne moลพe izravno pristupiti takvim ฤlanovima. ฤŒlanu privatne klase pristupaju samo funkcije ฤlana i prijatelja.

Primjer 2

#include <iostream>
using namespace std;
class ClassA {
public:
	void set_a(int val);
	int get_a(void);

private:
	int a;
};
int ClassA::get_a(void) {
	return a;
}
void ClassA::set_a(int val) {
	a = val;
}
int main() {
	ClassA a;
	a.set_a(20); 
	cout << "Value of a is: " << a.get_a(); 
	return 0;
}

Izlaz:

C++ Izlaz ฤlana privatne klase Primjer 2

Evo snimke zaslona koda:

C++ Primjer 2 koda ฤlana privatne klase

Code Objaลกnjenje:

  1. Ukljuฤite iostream datoteku zaglavlja u naลก kod da biste koristili njezine funkcije.
  2. Ukljuฤite prostor imena std u naลก kod da biste koristili njegove klase bez pozivanja.
  3. Napravite klasu pod nazivom ClassA.
  4. Koristite modifikator javnog pristupa da oznaฤite ฤlana klase koji ฤ‡e se stvoriti kao javno dostupan.
  5. Napravite funkciju pod nazivom set_a() koja uzima jednu cjelobrojnu vrijednost val.
  6. Napravite funkciju pod nazivom get_a().
  7. Upotrijebite modifikator privatnog pristupa da oznaฤite ฤlana klase koji ฤ‡e se stvoriti kao privatno pristupaฤan.
  8. Deklarirajte cjelobrojnu varijablu pod imenom a.
  9. Kraj tijela razreda.
  10. Za pristup funkciji get_a() upotrijebite naziv klase i operator rezolucije opsega. ลฝelimo definirati ลกto funkcija radi kada se pozove.
  11. Funkcija get_a() trebala bi vratiti vrijednost varijable a kada se pozove.
  12. Kraj definicije funkcije get_a().
  13. Za pristup funkciji set_a() upotrijebite naziv klase i operator rezolucije opsega. ลฝelimo definirati ลกto funkcija radi kada se pozove.
  14. Dodjeljivanje vrijednosti varijable val varijabli a.
  15. Kraj definicije funkcije set_a().
  16. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  17. Napravite instancu ClassA i dajte joj ime a.
  18. Koristite gornju instancu klase i funkciju set_a() da dodijelite vrijednost 20 varijabli a.
  19. Ispis nekog teksta uz vrijednost varijable a na konzoli. Vrijednost varijable a dobiva se pozivom funkcije get_a().
  20. Program mora vratiti vrijednost nakon uspjeลกnog zavrลกetka.
  21. Kraj tijela funkcije main().

Zaลกtiฤ‡eni ฤlanovi nalaze se izmeฤ‘u privatnih i javnih, dodajuฤ‡i jednu kljuฤnu moguฤ‡nost nasljeฤ‘ivanja.

ล to je zaลกtiฤ‡ena klasa?

ฤŒlanovi klase oznaฤeni kao zaลกtiฤ‡eni imaju prednost u odnosu na one koji su oznaฤeni kao privatni. Njima se moลพe pristupiti funkcijama unutar klase njihove definicije. Osim toga, moลพe im se pristupiti iz izvedenih klasa.

Primjer 3

#include <iostream>
using namespace std;
class ParentClass {
protected:
	int value;
};
class ChildClass : public ParentClass {
public:
	void setId(int x) {
		value = x;
	}
	void displayValue() {
	cout << "Value is: " << value << endl;
	}
};
int main() {
	ChildClass c;
	c.setId(21);
	c.displayValue();
	return 0;
}

Izlaz:

C++ Izlaz zaลกtiฤ‡enog ฤlana klase Primjer 3

Evo snimke zaslona koda:

C++ Primjer 3 koda nasljeฤ‘ivanja zaลกtiฤ‡enih klasa

Code Objaลกnjenje:

  1. Ukljuฤite iostream datoteku zaglavlja u naลก kod da biste koristili njezine funkcije.
  2. Ukljuฤite prostor imena std u naลก kod da biste koristili njegove klase bez pozivanja.
  3. Napravite klasu pod nazivom ParentClass.
  4. Koristite modifikator zaลกtiฤ‡enog pristupa da oznaฤite ฤlana klase koji ฤ‡e se stvoriti kao zaลกtiฤ‡en.
  5. Napravite cjelobrojnu varijablu pod nazivom vrijednost.
  6. Kraj tijela razreda.
  7. Napravite novu klasu pod nazivom ChildClass koja nasljeฤ‘uje ParentClass.
  8. Upotrijebite modifikator zaลกtiฤ‡enog pristupa da oznaฤite ฤlana klase koji ฤ‡e se stvoriti kao pristupaฤan klasama podreฤ‘enim.
  9. Napravite funkciju pod nazivom setId() koja uzima jednu cjelobrojnu vrijednost x.
  10. Pridjeljivanje vrijednosti varijable x vrijednosti varijable.
  11. Kraj definicije funkcije setId().
  12. Napravite funkciju pod nazivom displayValue().
  13. Ispiลกite vrijednost varijable pod nazivom vrijednost na konzoli uz ostali tekst.
  14. Kraj tijela funkcije displayValue().
  15. Kraj tijela klase pod nazivom ChildClass.
  16. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  17. Napravite instancu ChildClass i dajte joj ime c.
  18. Koristite gornju instancu klase i funkciju setId() da dodijelite vrijednost 21 varijabli x.
  19. Koristite gornju instancu klase za poziv funkcije pod nazivom displayValue().
  20. Program mora vratiti vrijednost nakon uspjeลกnog zavrลกetka.
  21. Kraj tijela funkcije main().

Osim pohranjivanja podataka, klasa takoฤ‘er grupira funkcije koje rade s tim podacima.

Funkcije ฤlanova klase

Funkcije nam pomaลพu manipulirati podacima. Funkcije ฤlanova klase mogu se definirati na dva naฤina:

  • Unutar definicije klase
  • Izvan definicije klase

Ako funkcija treba biti definirana izvan definicije klase, moramo koristiti operator razluฤivanja opsega (::). Ovo treba biti popraฤ‡eno nazivima klasa i funkcija.

Primjer 4

#include <iostream>
#include <string>
using namespace std;
class Guru99
{
public:
	string tutorial_name;
	int id;
	void printname();
	void printid()
	{
		cout << "Tutorial id is: "<< id;
	}
};
void Guru99::printname()
{
	cout << "Tutorial name is: " << tutorial_name;
}
int main() {
	Guru99 guru99;
	guru99.tutorial_name = "C++";
	guru99.id = 1001;
	guru99.printname();
	cout << endl;
	guru99.printid();
	return 0;
}

Izlaz:

C++ Izlaz funkcija ฤlanica klase Primjer 4

Evo snimke zaslona koda:

C++ Primjer 4 koda funkcija ฤlanica klase

Code Objaลกnjenje:

  1. Ukljuฤite datoteku zaglavlja iostream u naลก program da biste koristili njegove funkcije.
  2. Ukljuฤite datoteku zaglavlja niza u naลก program da biste koristili njegove funkcije.
  3. Ukljuฤite prostor imena std u naลก kod da biste koristili njegove klase bez pozivanja.
  4. Stvorite klasu pod nazivom Guru99.
  5. Upotrijebite modifikator javnog pristupa kako biste oznaฤili ฤlanove klase koje ฤ‡emo stvoriti kao javno dostupne.
  6. Stvorite string varijablu pod nazivom tutorial_name.
  7. Napravite cjelobrojnu varijablu imena id.
  8. Napravite funkciju pod nazivom printname(). Ova funkcija nije definirana unutar definicije klase.
  9. Kreirajte funkciju pod nazivom printid(). Ova funkcija je definirana unutar definicije klase. Njeno tijelo je dodano unutar definicije klase.
  10. Ispiลกite vrijednost ID-a varijable uz ostali tekst na konzoli. Imajte na umu da je ovo dodano unutar tijela funkcije printid(). Izvrลกit ฤ‡e se samo kada se pozove funkcija printid().
  11. Kraj tijela funkcije printid().
  12. Kraj tijela razreda Guru99.
  13. Poฤetak definicije funkcije printname().
  14. Ispiลกite vrijednost varijable tutorial_name na konzoli uz ostali tekst. Imajte na umu da je ovo dodano unutar tijela printname() funkcije. Izvrลกit ฤ‡e se samo kada se pozove funkcija printname().
  15. Kraj definicije printname() funkcije.
  16. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  17. Stvori instancu klase Guru99 i dajuฤ‡i mu ime guru99.
  18. Koristite gornju instancu da biste dodijelili vrijednost C++ na varijablu tutorial_name.
  19. Upotrijebite instancu guru99 da dodijelite vrijednost 1001 varijabli id.
  20. Koristite instancu guru99 za poziv funkcije printname() .
  21. Pozovite naredbu end (end line) za ispis novog praznog retka na konzoli.
  22. Koristite instancu guru99 za poziv funkcije printid().
  23. Program mora vratiti vrijednost nakon uspjeลกnog zavrลกetka.
  24. Kraj tijela funkcije main().

Dvije posebne funkcije ฤlanice automatski se izvrลกavaju kada se objekt stvori i kada se uniลกti.

Konstruktori i destruktori

ล to je konstruktor?

Konstruktori su posebne funkcije koje inicijaliziraju objekte. C++ Sastavljaฤi Pozovite konstruktor prilikom stvaranja objekta. Konstruktori pomaลพu u dodjeljivanju vrijednosti ฤlanovima klase. Naravno, to je nakon ลกto im je dodijeljen odreฤ‘eni memorijski prostor.

ล to je destruktor?

Destruktori s druge strane pomaลพu u uniลกtavanju objekata klase.

Naziv konstruktora mora biti sliฤan nazivu klase. Konstruktori nemaju povratnu vrstu.

Konstruktor se moลพe definirati unutar ili izvan tijela klase. Ako je definirano izvan tijela klase, treba biti definirano s nazivom klase i operatorom razluฤivanja opsega (::).

Primjer 5

#include <iostream>  
using namespace std;
class ClassA {
public:
	ClassA() {
		cout << "Class constructor called"<<endl;
	}
	~ClassA() {
		cout << "Class destructor called"<<endl;
	}
};

int main() {
	ClassA a;
	int p = 1;
		if (p) {
			ClassA b; 
		}   
}

Izlaz:

C++ konstruktor i destruktor Primjer 5 izlaz

Evo snimke zaslona koda:

C++ konstruktor i destruktor Primjer 5 koda

Code Objaลกnjenje:

  1. Ukljuฤite datoteku zaglavlja iostreama u kรดd da biste koristili njegove funkcije.
  2. Ukljuฤite prostor imena std u naลก kod da biste koristili njegove klase bez pozivanja.
  3. Napravite klasu pod nazivom ClassA.
  4. Koristite modifikator javnog pristupa da oznaฤite ฤlana kojeg ฤ‡emo stvoriti kao javno dostupnog.
  5. Napravite konstruktor za klasu.
  6. Tekst za ispis na konzoli kada se pozove konstruktor. Kraj je a C++ kljuฤna rijeฤ, ลกto znaฤi zavrลกni redak. Pomiฤe kursor miลกa u sljedeฤ‡i redak.
  7. Kraj tijela konstruktora klase.
  8. Napravite destruktor za klasu.
  9. Tekst za ispis na konzoli kada se pozove destruktor. Kraj je a C++ kljuฤna rijeฤ, ลกto znaฤi zavrลกni redak. Pomiฤe kursor miลกa u sljedeฤ‡i redak.
  10. Kraj tijela razaraฤa.
  11. Kraj tijela razreda.
  12. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  13. Napravite objekt klase i dajte mu ime a. Pozvat ฤ‡e se konstruktor.
  14. Napravite cjelobrojnu varijablu pod nazivom p i dodijelite joj vrijednost 1.
  15. Stvorite blok naredbe if pomoฤ‡u varijable p.
  16. Napravite objekt klase i dajte mu ime b. Pozvat ฤ‡e se destruktor.
  17. Kraj tijela naredbe if.
  18. Kraj tijela funkcije main().

Pitanja i odgovori

Klasa je korisniฤki definirani nacrt koji grupira ฤlanove podataka i funkcije ฤlanova u jedan tip. Objekt je konkretna instanca izgraฤ‘ena iz te klase koja sadrลพi vlastitu kopiju podataka opisanih nacrtom.

Glavna razlika je zadani pristup: ฤlanovi klase su privatni prema zadanim postavkama, dok su ฤlanovi struktura su prema zadanim postavkama javni. Oba podrลพavaju nasljeฤ‘ivanje, konstruktore i enkapsulaciju u C++.

C++ podrลพava tri uobiฤajena tipa konstruktora: zadani konstruktor bez argumenata, parametrizirani konstruktor koji prihvaฤ‡a vrijednosti za inicijalizaciju ฤlanova i konstruktor kopiranja koji stvara novi objekt iz postojeฤ‡eg objekta iste klase.

Prijateljska funkcija je funkcija koja nije ฤlan klase i kojoj je dodijeljen pristup privatnim i zaลกtiฤ‡enim ฤlanovima klase. Deklarira se unutar klase kljuฤnom rijeฤi friend, ali se definira izvan nje kao obiฤna funkcija.

Pokazivaฤ this je implicitni pokazivaฤ dostupan unutar svake nestatiฤke funkcije ฤlanice. Pokazuje na objekt koji je pozvao funkciju, omoguฤ‡ujuฤ‡i kodu da se poziva na ฤlanove tog objekta i rjeลกava sukobe imenovanja izmeฤ‘u parametara i ฤlanova podataka.

Enkapsulacija objedinjuje podatke i funkcije koje na njima rade unutar jedne klase, a zatim skriva interne detalje pomoฤ‡u privatnih ฤlanova. Javne funkcije ฤlanova otkrivaju kontrolirano suฤelje, ลกtiteฤ‡i podatke od sluฤajnog ili neovlaลกtenog pristupa.

Da. AI asistenti za kodiranje pretvaraju kratki upit ili komentar u definicije radne klase, ukljuฤujuฤ‡i ฤlanove podataka, specifikatore pristupa, konstruktore i funkcije ฤlanova. Uvijek pregledajte generirane razine pristupa i logiku inicijalizacije prije kompajliranja koda.

Da. GitHub kopilot predlaลพe deklaracije klasa, konstruktore, gettere i settere dok tipkate. Brzo obraฤ‘uje ponavljajuฤ‡e standardne postavke, iako biste i dalje trebali provjeriti pristup ฤlanova, logiku konstruktora i koriลกtenje objekta prije izgradnje.

Saลพmite ovu objavu uz: