A tankönyv nyelve egy könyv, 41. oldal

A komplex osztályhoz képest az új komplex osztály a konstruktoron túl bemutatja az objektum adatok eléréséhez szükséges re () és im () komponensfunkciókat is. Visszaküldik a referenciákat a tárgy valós és képzeletbeli részeihez, amelyekhez hívják őket.

Emlékezzünk vissza, hogy a konstruktor nem adja meg a visszatérési típust. A konstruktor hívásai is vannak. A programozó kifejezett kijelzése nélkül a konstruktor mindig automatikusan hívásra kerül egy osztály objektum meghatározásakor (létrehozásakor). Ebben az esetben a konstruktor paramétereinek alapértelmezett értékeit használják. Például, ha objektumát implicit konstruktív hívással határozza meg

kapunk egy hívást СС. re () értéke 1,0. A cc.im () függvény hivatkozást ad vissza a cc.imag -ra, és a cc objektum ezen elemének értéke 0,0, amelyet a konstruktorparaméter alapértelmezett értékeként ad meg.

Tehát "a konstruktor a memória töredékét olyan tárgyba fordítja, amelyhez a rendszer típusának szabályai teljesülnek" [2]. Olyan objektumra, amelyet az osztály definíciója nyújt.

A konstruktor minden osztályhoz létezik, és a programozó kifejezett utasításai nélkül is létrehozható. Így az áruk és komplex osztályok esetében automatikusan létrejöttek a konstruktorok.

Alapértelmezés szerint egy konstruktort paraméterek nélkül és egy T :: T (const T) űrlap másolat-konstruktora hoz létre, ahol T az osztály neve. Például,

Egy ilyen konstruktor mindig létezik. Alapértelmezés szerint a másolási konstruktor nyilvánosan van létrehozva. Egy osztályban lehet több konstruktor (túlterhelés), de csak az egyik a paraméterek alapértelmezett értékével.

A konstruktor nem nevezhető rendszeres összetevőként. Konstruktor kifejezetten felhívásához két különböző szintaxisformát használhat:

class_name object_name (a konstruktor tényleges_paraméterei);
class_name (a konstruktor tényleges_paraméterei);

Az első űrlap csak az aktuális paraméterek nem üres listájával engedélyezett. Ez magában foglalja a konstruktornak a következő objektum meghatározása során történő hívását:

komplex SS (10.3,0.22); // SS.real == 10.3;
// SS.imag == 0.22
komplex E (2,345); // EE.real == 2.345;
// default EE.imag == 0.0
komplex DD (); // Hiba! A fordító úgy dönt, hogy ez
// prototípus funkció paraméterek nélkül,
// visszaküldi a típuskomplex értékét

A konstruktorhoz való explicit felhívás második formája olyan objektum létrehozásához vezet, amely nem rendelkezik névvel. Az ilyen hívás által létrehozott névtelen objektum használható azokban a kifejezésekben, ahol megengedett az osztály objektumának használata. Például:

Ez a definíció egy ZZ objektumot hoz létre, amelyhez egy névtelen objektum értékét (az elemek real == 4.0, imag == 5.0) hozzák létre, amelyet kifejezetten a konstruktornak hívnak.

Kétféle módon állíthatja elő az objektumadatokat konstruktőrökkel. Az első módszert, nevezetesen a paraméterek átadását a konstruktor testére, már példákkal bizonyították. A második módszer az objektum inicializátorok listájának alkalmazása. Ez a lista a paraméterek listája és a kivitelező teste között helyezkedik el:

class_name (paraméterlista):
spisok_initsializatorov_ részadattal <тело_конструктора>

Minden lista initializer egy adott összetevőre utal, és így néz ki:

datasource_name (kifejezés) Például:
AZ osztály nyilvános:
AZ (int, float en, char cn). ii (5),
annak (ii * en + in), cc (cn) <>
>;
AZ A (2.3.0, 'd'); // Megnevezett objektum létrehozása
// az összetevőkkel A.ii == 5,
// A.ee == 17, A.cc == 'd'
AZ X = AZ (0,2,0, 'z'); // Unnamed objektum jön létre, in
// amely ii == 5, annak == 10,
// cc == 'z', és másolt
// az X objektumhoz

A konstruktorok felsorolt ​​jellemzői, a hozzáférési összetevők státuszára vonatkozó megállapodás és a "destructor" új koncepciója a "karakterlánc" osztály következő definícióját szemlélteti:

// STROKA.CPP - fájl az osztálydefinícióval "karakter
// a "
#include // A könyvtár karakterláncfunkciókhoz
#include
osztályú stroka
char * ch; // Mutató szövegszövegre
int len; // A szöveglánc hossza
nyilvános: // Nyilvános funkciók:
// osztály objektum építői:
// Objektumot hoz létre új üres karakterláncként:
stroka (int N = 80):
// A sor nem tartalmaz információkat:
lnn (0)
ch [0] = '\ 0';
> // A megadott stringen egy objektumot hoz létre:
stroka (const char * arch)
ch = új char [len + 1];
strcpy (ch, arch);
>
int len_str (void) // Visszatér a húr hosszára

char * string (void) // Visszaadja a mutatót egy karakterláncba

void display (void) // A karakterláncra vonatkozó információk nyomtatása

object_name. imya_ elem

A második művelet lehetővé teszi az objektum komponens adatainak elérését a megadott mutatónak megfelelően az objektumhoz:

Vessünk egy pillantást az osztályelemek jellemzőire. Bár kívülről van szó, egy osztály összetevőadatai hasonlóak lehetnek egy blokkban vagy egy függvényben meghatározott adatokhoz, de vannak jelentős különbségek. Az osztályadatokat nem kell meghatározni vagy le kell írni, mielőtt először használják az osztály tulajdonában lévő funkciókban. Ugyanez igaz az osztályhoz tartozó funkciókra, azaz Az osztály egyik funkciójából érhető el, mielőtt az osztálytestben meghatározásra kerülne. Az osztály valamennyi összetevője "látható" a test összes szereplőjében.

Ezért, a "fájl", a "blokk", a "funkció" és a "C ++" körökön kívül különleges "osztály" hatókört is bevezetett.

Annak érdekében, hogy egy osztálykomponens egyetlen példány legyen, és nem replikálva legyen minden új osztályobjektum létrehozásakor, az osztályban statikusnak kell lennie, azaz. statikus tulajdonsággal kell rendelkeznie. A statikus elemek bizonyos lehetőségeit már bemutatták a "raktár raktárában lévő áruk" kategóriájában.

Az inicializálás után az osztály statikus összetevői a programban még az osztály osztályainak meghatározása előtt is használhatók. Ezt a képességet a nyilvános adatokhoz a minősített alkatrész neve adja. Ha legalább egy osztályobjektumot definiálunk, a statikus összetevõk normál összetevõkként érhetõk el. az osztály komponenseinek kiválasztásával ("." és "->"). Itt van egy nehézség. Az osztály statikus adatait a hozzáférési státusz szabályai határozzák meg. Ha a statikus adatok privát vagy védettek. akkor külső komponensek segítségével érhetők el. Minden ilyen komponens funkciót meg kell adnia egy objektum nevét. Ha egy osztály statikus adatait elérjük, az osztály objektumai még nem definiálhatók, vagy több lehet, és mindegyik alkalmas az összetevő funkcióinak hívására. Objektumnév nélkül a szokásos összetevő funkciót nem lehet a szintaktikai követelményeknek megfelelően hívni. De milyen objektumot választani egy hívásért, mert az osztály minden egyes statikus eleme egyedülálló? Szeretnék képesnek lenni anélkül, hogy egy adott objektum nevét meg kellene adnia statikus osztályadatok elérésekor. Ezt a funkciót a statikus összetevő funkciói biztosítják.

Kapcsolódó cikkek