Short faq c
Gyors GYIK a C + + -on
[Az ebben a dokumentumban említett összes bejegyzett védjegy a megfelelő tulajdonosok tulajdonát képezi.]
[8.2] Mi történik a kapcsolat hozzárendelésével?
[8.3] Mi történik, ha visszaadom a függvény egyik linkjét?
[8.4] Hogyan állíthatom vissza egy hivatkozást egy másik objektumra hivatkozással?
[8.5] Mikor használnám a linkeket, és mely esetekben kell mutatókat használni?
SZEKCIÓ [9]: Beépített (inline) funkciók
[9.1] Mi a beépített funkció?
[9.2] Hogyan befolyásolhatják a beépített funkciók a biztonság-sebesség arányt?
[9.3] Miért kell a beépített funkciókat használni? Miért nem csak #define makrókat használsz?
[9.4] Mit tehetek egy funkció meghatározásában - nem az osztály tagja, mint beépített?
[9.5] Hogyan építhetek be egy beépített függvényt egy osztály tagjaiból?
[9.6] Van-e másik mód egy inline függvény definiálására - az osztály tagja?
[9.7] A beépített funkciók szükségszerűen növelik-e a teljesítményt?
SZEKCIÓ [10]: Tervezők
[10.1] Mit építenek?
[10.3] Hogyan hívhatunk egy másik konstruktort egy konstruktorból az objektum inicializálására?
[10.4] Úgy látszik, hogy a Fred alapértelmezett konstruktora mindig úgy néz ki, mint Fred :: Fred ()?
[10.5] Melyik konstruktort fog hívni, ha Fred típusú objektumokat hozok létre?
[10.6] A konstruktorok "inicializálási listákat" vagy "érték-hozzárendeléseket" használnak-e?
[10.7] Használhatom ezt a konstruktorban?
[10.8] Mi a "nevezett konstruktor idióma"?
[10.9] Miért nem tudom inicializálni az osztály statikus tagját a konstruktor-inicializálási listában?
[10.10] Miért fogadnak el elrendezési hibákat statikus adatokkal rendelkező osztályok?
[10.11] Mi a statikus inicializálási sorrend fiasco?
[10.12] Hogyan lehet megakadályozni a hibát a statikus inicializálás sorrendjében?
[10.13] Hogyan kezeljük az objektumok statikus inicializálásának sorrendjével kapcsolatos hibákat - az osztály tagjai?
[10.14] Hogyan kezelhetem a konstruktorban bekövetkezett hibát?
ARZDEL [11]: Destruktorok
[11.1] Mi a romboló?
[11.2] Mennyire vannak a helyi objektumok destruktorai?
[11.3] Milyen sorrendben hívják a tömb objektumok destruktorjait?
[11.4] Újra rakhatom az osztályom megsemmisítőjét?
[11.5] Megadhatom-e egy helyi változó destruktorát?
[11.6] Mi van, ha helyi változót akarok "meghalni" a záró zárójel előtt? Meg tudok okozni egy helyi változó megsemmisítését, ha feltétlenül szükséges?
[11.7] Rendben, nem fogom kifejezetten hívni a megsemmisítőt. De hogyan tudok megbirkózni ezzel a problémával?
[11.8] Mi van, ha nem tudok egy változót külön blokkba tenni?
[11.9] Megadhatom-e az újonnan létrehozott objektum megsemmisítését?
[11.10] Mi az "elhelyezés új" szintaxis és miért van szükség?
[11.11] Amikor megsemmisítőt írok, kifejezetten hívnám el a destruktorokat az osztályom tagjainak?
[11.12] Amikor egy származtatott osztály megsemmisítőjét írom, meg kell-e hívnom az őse destruktorát?
A hivatkozásokat gyakran használják egy paraméter átadásához referenciaként:
Ebben a példában i és j a főfunkció x és y változóinak álnevek. Más szóval, i = x. Nem egy mutató x-re, és nem másolat x-re. de maga az x. Minden, amit te csinálsz i. x-vel végzett. és fordítva.
[8.2] Mi történik a kapcsolat hozzárendelésével?
[8.3] Mi történik, ha visszaadom a függvény egyik linkjét?
Ebben az esetben a függvényhívás a hozzárendelõ operátor bal oldalán (mûködés) lehet.
Első pillantásra egy ilyen rekord furcsának tűnhet. Például az f () = 7 írása értelmetlennek tűnik. Ha azonban egy a Array objektum. a legtöbb ember esetében a [i] = 7 értelmes, bár a [i] csak egy álcázott hívás az Array :: operator [] (int) függvényhez. amely az Array osztály indexének inverziós kezelője.
[8.4] Hogyan állíthatom vissza egy hivatkozást egy másik objektumra hivatkozással?
Elvileg lehetetlen.
Nem lehet elválasztani egy referenciát a tárgytól.
[8.5] Mikor használnám a linkeket, és mely esetekben kell mutatókat használni?
Linkek használatával, amikor csak tudsz, és mutatókat, amikor szükséged van rá.
A hivatkozások általában a mutatókhoz képest előnyösebbek, ha nem kell "átirányítani" őket [8.4]. Ez általában azt jelenti, hogy a linkek különösen hasznosak az osztály nyilvános részében. A linkek általában az objektum felszínén jelennek meg, és a mutatók rejtve maradnak.
Megjegyzés: a C-ben szerzett tapasztalattal rendelkező programozók gyakran nem kedvelik a referenciákat, mert a referencián áthaladó paraméterek kifejezetten nem jelennek meg a hívókódban. Azonban, miután a C ++-ban dolgoztunk valamilyen tapasztalattal, rájövünk, hogy ez az információ elrejtésének egyik formája, ami inkább előny, mint hátrány. Ie a programozónak meg kell írnia a kódot a feladat szempontjából, nem a számítógépen (a programozóknak a kódot a probléma nyelvén kell írniuk).
[9.1] Mi a beépített funkció?
Egy beépített függvény egy olyan funkció, amelynek kódja közvetlenül beillesztésre kerül a hívás helyére. Mint a #define által definiált makrók. A beépített funkciók növelik a termelékenységet a hívás költségének és (különösen!) A további optimalizálás ("eljárási integráció") miatt.
[9.2] Hogyan befolyásolhatják a beépített funkciók a biztonság-sebesség arányt?
A normál C-ben kaphatunk "kapszulázott struktúrákat" úgy, hogy mutatót helyezünk el a bennük lévő ürességhez. és arra kényszeríti, hogy pontosan valós adatokra mutasson, amelyek típusa ismeretlen a szerkezet felhasználói számára. Így a felhasználók nem tudják, hogyan kell értelmezni ezeket az adatokat, és a hozzáférési funkciók átkapcsolják a mutatót a kívánt rejtett típusra. Ez bizonyos befogási szintet eredményez.
Sajnos ez a módszer ellentétes a biztonsági típusok, és megköveteli a függvényhívás elérni a struktúra területek (ha engedjük, hogy közvetlen hozzáférést, akkor lehet, hogy bárki, hiszen tudni fogja, hogyan kell értelmezni az adatokat, amely jelzi az érvénytelen * Az ilyen viselkedés a felhasználó részéről nehézséget okoz a szolgáltatandó adatok szerkezetének későbbi megváltoztatásában.)
A funkció hívásának költsége kicsi, de némi növekedést eredményez. A C ++ osztályok lehetővé teszik a funkciók beágyazását, ami a kapszulázás biztonságát és a közvetlen hozzáférés sebességét biztosítja. Ezenkívül a beépített függvények típusát a fordító ellenőrzi, ami előnyös a (?) Sishnymi #define makróknál.
[9.3] Miért kell a beépített funkciókat használni? Miért nem csak #define makrókat használsz?
Mivel a #define makrók veszélyesek [9.3], veszélyesek [34.1], veszélyesek [34.2], veszélyesek [34.3].
A #define makrókkal ellentétben az inline függvények nem ismertek kettős számítási hibákkal, mivel a beépített függvény minden argumentuma csak egyszer kerül kiértékelésre. Más szavakkal, a beépített funkció hívása megegyezik a rendszeres funkció hívásával, csak gyorsabb:
A makrókkal ellentétben a beépített függvények argumentumainak típusát ellenőrizzük, és elvégezzük az összes szükséges átalakítást.
A makrók károsak az egészségre; Ne használja őket, ha nem szükséges