C++ třídy a objekty
Třída v C++ je stavebním kamenem, který vede k objektově orientovanému programování. Je to uživatelsky definovaný datový typ, který obsahuje své vlastní datové členy a členské funkce, ke kterým lze přistupovat a používat je vytvořením instance dané třídy. Třída C++ je jako plán pro objekt. Například: Zvažte třídu Auta . Může existovat mnoho vozů s různými jmény a značkami, ale všechna budou sdílet některé společné vlastnosti, jako budou mít všechny 4 kola , Rychlostní omezení , najeté kilometry, atd. Tady je tedy auto třída a kola, rychlostní limity a počet najetých kilometrů jsou jejich vlastnosti.
- Třída je uživatelsky definovaný datový typ, který má datové členy a členské funkce.
- Datové členy jsou datové proměnné a členské funkce jsou funkce používané ke společné manipulaci s těmito proměnnými. Tyto datové členy a členské funkce definují vlastnosti a chování objektů ve třídě.
- Ve výše uvedeném příkladu tř Auto , datovým členem bude rychlostní omezení , najeté kilometry, atd. a členské funkce mohou být použití brzd , zvýšení rychlosti, atd.
An Objekt je instancí třídy. Když je definována třída, není alokována žádná paměť, ale když je vytvořena instance (tj. je vytvořen objekt), paměť je alokována.
Definování třídy a deklarace objektů
Třída je definována v C++ pomocí klíčového slova class následovaného názvem třídy. Tělo třídy je definováno uvnitř složených závorek a ukončeno středníkem na konci.
Deklarace objektů
Když je definována třída, je definována pouze specifikace pro objekt; není přidělena žádná paměť ani úložiště. Chcete-li používat funkce dat a přístupu definované ve třídě, musíte vytvořit objekty.
Syntax
ClassName ObjectName;
Přístup k datovým členům a členským funkcím : K datovým členům a členským funkcím třídy lze přistupovat pomocí operátoru tečka(‘.’) s objektem. Pokud je například název objektu obj a chcete získat přístup k členské funkci se jménem printName() pak budeš muset napsat obj.printName() .
Přístup k datovým členům
Veřejné datové členy jsou také přístupné stejným způsobem, avšak k soukromým datovým členům není povolen přímý přístup objektu. Přístup k datovému členu závisí výhradně na řízení přístupu tohoto datového člena. Toto řízení přístupu je dáno modifikátory Access v C++. Existují tři modifikátory přístupu: veřejné, soukromé a chráněné .
C++
// C++ program to demonstrate accessing of data members> #include> using> namespace> std;> class> Geeks {> > // Access specifier> public> :> > // Data Members> > string geekname;> > // Member Functions()> > void> printname() { cout < <> 'Geekname is:'> < < geekname; }> };> int> main()> {> > // Declare an object of class geeks> > Geeks obj1;> > // accessing data member> > obj1.geekname => 'Abhi'> ;> > // accessing member function> > obj1.printname();> > return> 0;> }> |
Výstup
Geekname is:Abhi
Členské funkce ve třídách
Členskou funkci lze definovat 2 způsoby:
- Definice vnitřní třídy
- Definice mimo třídu
Chcete-li definovat členskou funkci mimo definici třídy, musíme použít rozlišení rozsahu:: operátor spolu s názvem třídy a názvem funkce.
C++
// C++ program to demonstrate function> // declaration outside class> > #include> using> namespace> std;> class> Geeks> {> > public> :> > string geekname;> > int> id;> > > // printname is not defined inside class definition> > void> printname();> > > // printid is defined inside class definition> > void> printid()> > {> > cout < <> 'Geek id is: '> < } }; // Definition of printname using scope resolution operator :: void Geeks::printname() { cout < <'Geekname is: ' < } int main() { Geeks obj1; obj1.geekname = 'xyz'; obj1.id=15; // call printname() obj1.printname(); cout < < endl; // call printid() obj1.printid(); return 0; }> |
Výstup
Geekname is: xyz Geek id is: 15
Všimněte si, že všechny členské funkce definované v definici třídy jsou standardně v souladu , ale můžete také vložit jakoukoli netřídní funkci pomocí klíčového slova inline s nimi. Inline funkce jsou skutečné funkce, které se během kompilace všude kopírují, jako je pre-procesorové makro, takže režie volání funkcí je snížena.
Poznámka: Prohlášení a funkce přítele je způsob, jak poskytnout soukromý přístup k nečlenské funkci.
Konstruktéři
Konstruktéři jsou speciální členy třídy, které jsou volány kompilátorem pokaždé, když je vytvořen objekt této třídy. Konstruktory mají stejný název jako třída a mohou být definovány uvnitř nebo vně definice třídy. Existují 3 typy konstruktorů:
- Výchozí konstruktory
- Parametrizované konstruktory
- Kopírovat konstruktory
C++
// C++ program to demonstrate constructors> #include> using> namespace> std;> class> Geeks> {> > public> :> > int> id;> > > //Default Constructor> > Geeks()> > {> > cout < <> 'Default Constructor called'> < < endl;> > id=-1;> > }> > > //Parameterized Constructor> > Geeks(> int> x)> > {> > cout < <> 'Parameterized Constructor called '> < < endl;> > id=x;> > }> };> int> main() {> > > // obj1 will call Default Constructor> > Geeks obj1;> > cout < <> 'Geek id is: '> < // obj2 will call Parameterized Constructor Geeks obj2(21); cout < <'Geek id is: ' < return 0; }> |
Výstup
Default Constructor called Geek id is: -1 Parameterized Constructor called Geek id is: 21
A Kopírovat konstruktor vytvoří nový objekt, který je přesnou kopií stávajícího objektu. Kompilátor poskytuje výchozí konstruktor kopírování všem třídám.
Syntax:
class-name (class-name &){} ničitelé
ničitel je další speciální členská funkce, která je volána kompilátorem, když končí rozsah objektu.
C++
// C++ program to explain destructors> #include> using> namespace> std;> class> Geeks> {> > public> :> > int> id;> > > //Definition for Destructor> > ~Geeks()> > {> > cout < <> 'Destructor called for id: '> < < id < } }; int main() { Geeks obj1; obj1.id=7; int i = 0; while ( i <5 ) { Geeks obj2; obj2.id=i; i++; } // Scope for obj2 ends here return 0; } // Scope for obj1 ends here> |
Výstup
Destructor called for id: 0 Destructor called for id: 1 Destructor called for id: 2 Destructor called for id: 3 Destructor called for id: 4 Destructor called for id: 7
Zajímavý fakt (vzácně známý koncept)
Proč dáváme na konci hodiny středníky?
Mnoho lidí by mohlo říci, že je to základní syntaxe a na konci třídy bychom měli dát středník, jak to definuje její pravidlo v cpp. Ale hlavním důvodem, proč jsou středníky na konci třídy, je kontrola kompilátoru, zda se uživatel nepokouší vytvořit instanci třídy na jejím konci.
Ano, stejně jako struktura a sjednocení, můžeme také vytvořit instanci třídy na konci těsně před středníkem. Výsledkem je, že jakmile spuštění dosáhne tohoto řádku, vytvoří třídu a přidělí paměť vaší instanci.
C++
#include> using> namespace> std;> > class> Demo{> > int> a, b;> > public> :> > Demo()> // default constructor> > {> > cout < <> 'Default Constructor'> < < endl;> > }> > Demo(> int> a,> int> b):a(a),b(b)> //parameterised constructor> > {> > cout < <> 'parameterized constructor -values'> < < a < <> < < b < < endl;> > }> > }instance;> > > int> main() {> > > return> 0;> }> |
Výstup
Default Constructor
Vidíme, že jsme vytvořili instanci třídy Demo s názvem instance, v důsledku toho se zavolá výstup, který vidíme, je Výchozí konstruktor.
Podobně můžeme také volat parametrizovaný konstruktor pouhým předáním hodnot zde
C++
#include> using> namespace> std;> > class> Demo{> > public> :> > int> a, b;> > Demo()> > {> > cout < <> 'Default Constructor'> < < endl;> > }> > Demo(> int> a,> int> b):a(a),b(b)> > {> > cout < <> 'parameterized Constructor values-'> < < a < <> < < b < < endl;> > }> > > > }instance(100,200);> > > int> main() {> > > return> 0;> }> |
Výstup
parameterized Constructor values-100 200
Takže vytvořením instance těsně před středníkem můžeme vytvořit Instance of class.
Související články:
- Vícenásobná dědičnost v C++
- Čistý virtuální ničitel
- C++ kvíz