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.]

  • SZEKCIÓ [8]: Referenciák

    [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

    Kapcsolódó cikkek