Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Aké sú kľúčové rozdiely medzi štruktúrou a triedou C, ako majú vplyv na implementáciu dizajnu objektovo orientovaných programov v C?

Rozložme kľúčové rozdiely medzi štruktúrami C a triedami C ++ a ako tieto rozdiely ovplyvňujú návrh a implementáciu objektovo orientovaných programov v C a C ++.

C štruktúry vs. C ++ triedy:Kľúčové rozdiely

| Funkcia | C struct | Trieda C ++ Vplyv na OOP

|--------------------|----------------------------------------------|----------------------------------------------|-----------------|

| Predvolený prístup | „Public“ (členovia sú v predvolenom nastavení prístupní) „Súkromný“ (členovia sú v predvolenom nastavení neprístupní) | Zapuzdrenie

| členské funkcie (metódy) | Nie je povolené priamo. Môžete ich simulovať pomocou funkčných ukazovateľov. | Povolené. Triedy môžu mať metódy (funkcie), ktoré fungujú na údajoch triedy. | Zapuzdrenie, správanie

| dedičstvo | Nie je podporované. | Podporované (jednotné a viacnásobné dedičstvo). | Opätovné použitie, polymorfizmus

| polymorfizmus | Nie priamo podporované. Vyžaduje manuálnu implementáciu (napr. Používanie funkčných ukazovateľov a `neplatné*`). | Podporované (virtuálne funkcie, abstraktné triedy, rozhrania). | Flexibilita, rozšírenie

| Konštruktori/deštruktory | Nie je podporované. Inicializácia sa zvyčajne vykonáva s priradením alebo inicializačnými funkciami. | Podporované. Konštruktori inicializujú objekty, deštruktory čistia. | Správa zdrojov

| Preťaženie operátora | Nie je podporované. | Podporované. Umožňuje operátorom (+, -, *, ==atď.) Predefinovať sa pre objekty triedy. | Výraznosť

| šablóny | Nie je podporované. | Podporované. Umožňuje všeobecné programovanie (vytváranie tried, ktoré môžu pracovať s rôznymi typmi údajov). | Opätovné použitie kódu

| Pridelenie pamäte | Zvyčajne sa používa na statické pridelenie alebo pridelenie zásobníka. Môže sa používať s dynamicky pridelenou pamäťou prostredníctvom ukazovateľov. | Rovnaké ako štruktúry. Všeobecne sa uprednostňuje v objektových kontextoch, aby sa vytvorili objekty na halme na využitie polymorfizmu. | Správa pamäte |

Podrobne:

1. Ovládanie prístupu (zapuzdrenie):

- c štruktúry: Všetci členovia štruktúry C sú v predvolenom nastavení „verejní“. To znamená, že každá časť vášho kódu môže priamo pristupovať a upravovať údaje v štruktúre. Neexistuje vstavaný spôsob, ako skryť vnútorné údaje alebo obmedziť prístup.

- C ++ triedy: Predvolený špecifikátor prístupu pre triedu C ++ je „súkromný“. To znamená, že v predvolenom nastavení sú členské premenné a funkcie dostupné iba z samotnej triedy alebo z jej tried/funkcií priateľov. Na kontrolu viditeľnosti členov triedy používate „súkromné“ kľúčové slová „public“, „chránené“. To je rozhodujúce pre enkapsuláciu , jeden zo základných princípov OOP.

2. členské funkcie (metódy):

- c štruktúry: C štruktúry * nemôžu * priamo obsahovať funkcie (metódy) ako členov. Aby ste priradili funkcie so štruktúrou, zvyčajne používate funkčné ukazovatele ako členovia štruktúry. Toto je nepriamy a menej integrovaný prístup.

- C ++ triedy: Triedy * môžu * obsahovať členské funkcie (metódy). Tieto metódy fungujú na údajoch v triede a poskytujú spôsob interakcie a manipulácie s stavom objektu. To prísne spája údaje a funkcie, ktoré na nich fungujú, zlepšujú organizáciu a udržiavateľnosť.

3. dedičstvo:

- c štruktúry: C Štruktúry nie sú * podpora dedičstva. Nemôžete vytvoriť novú štruktúru, ktorá zdedí členov existujúcej štruktúry.

- C ++ triedy: Triedy C ++ * Do * Podporte dedičstvo. To vám umožní vytvárať nové triedy (odvodené triedy alebo podtriedy), ktoré zdedia vlastnosti a správanie existujúcich tried (základné triedy alebo supertriedy). To podporuje opätovné použitie kódu a umožňuje vám modelovať vzťahy medzi objektmi (napr. Dediča triedy „Dog“ od triedy „Animal“). Môžete tiež použiť viacnásobné dedičstvo (dedičstvo z viacerých základných tried).

4. polymorfizmus:

- c štruktúry: C štruktúry nemajú priamu podporu pre polymorfizmus (schopnosť objektu mať mnoho foriem). Môžete*simulovať*polymorfizmus v C pomocou funkčných ukazovateľov a `neplatné*`, ale vyžaduje viac manuálneho kódovania a je menej elegantný. V podstate vytvoríte tabuľku funkčných ukazovateľov a vyberiete príslušnú funkciu, ktorú chcete volať na základe typu objektu.

- C ++ triedy: C ++ poskytuje zabudovanú podporu polymorfizmu prostredníctvom:

- Virtuálne funkcie: Vyhlásené s kľúčovým slovom „Virtual“ v základnej triede. Ak sa virtuálna funkcia volá prostredníctvom ukazovateľa alebo odkazu na objekt základnej triedy, skutočná funkcia sa vykonáva za behu na základe * skutočného * typu objektu (Dynamic Dispatch).

- Abstraktné triedy: Trieda s aspoň jednou čistou virtuálnou funkciou (deklarovaná ako `=0"). Abstraktné triedy nemožno inštantovať priamo, ale definujú rozhranie, ktoré musia implementovať odvodené triedy.

5. Konštruktory a deštruktory:

- c štruktúry: C štruktúry nemajú konštruktory alebo deštruktory. Inicializácia sa zvyčajne vykonáva priradením hodnôt členom štruktúry po deklarovaní štruktúry alebo pomocou inicializačných funkcií. Čistenie (uvoľnenie dynamicky pridelenej pamäte) sa musí tiež vykonávať manuálne.

- C ++ triedy: Triedy C ++ majú konštruktory (špeciálne členské funkcie, ktoré sa automaticky nazývajú pri vytvorení objektu triedy) a deštruktorov (špeciálne členské funkcie, ktoré sa automaticky nazývajú pri zničení objektu). Konštruktory sa používajú na inicializáciu členov údajov objektu a deštruktory sa používajú na uvoľnenie akýchkoľvek zdrojov, ktoré objekt drží (napr. Dynamicky pridelená pamäť).

6. Preťaženie operátora:

- c štruktúry: Preťaženie operátora nie je podporované v C. Nemôžete predefinovať význam operátorov (ako +, -, ==) pre štruktúry.

- C ++ triedy: C ++ vám umožňuje preťažiť operátorov pre objekty triedy. To znamená, že môžete definovať, čo to znamená pridať spolu dva objekty vašej triedy, porovnať ich pre rovnosť atď. Môže to zvýšiť výrazný a ľahšie čitateľný kód.

7. šablóny:

- c štruktúry: C nemá šablóny.

- C ++ triedy: C ++ podporuje šablóny, ktoré vám umožňujú písať generický kód, ktorý môže pracovať s rôznymi typmi údajov bez toho, aby ste museli prepísať kód pre každý typ. Toto je výkonná funkcia pre opätovné použitie kódu.

Vplyv na implementáciu dizajnu objektovo orientovaných programov v C:

Z dôvodu týchto obmedzení je písanie skutočne objektovo orientovaných programov v C * výrazne * náročnejšie a vyžaduje si iný prístup. Musíte manuálne implementovať mnoho funkcií, ktoré sú zabudované do tried C ++. Tu je návod, ako by ste sa mohli priblížiť k dizajnu OOP v C:

1. Emulujúce zapuzdrenie:

- Použite kľúčové slovo „statické“ na obmedzenie rozsahu premenných a funkcií na aktuálny súbor. Toto poskytuje formu skrytia informácií, ale nie je tak robustná ako súkromná C ++.

- Používajte konvencie pomenovávania (napr. Predpona „súkromných“ členov s podčiarknutím:`_private_member`), aby ste uviedli, ktorí členovia majú byť interní. To sa spolieha na disciplínu programátora.

2. simulujúce metódy:

- Definujte funkcie, ktoré posúvajú ukazovateľ na štruktúru ako svoj prvý argument („tento“ ukazovateľový ekvivalent). Tieto funkcie pôsobia ako metódy pre štruktúru.

`` C

typedef struct {

int x;

int y;

} Bod;

void Point_move (bod *p, int dx, int dy) {// "metóda" pre bod

p-> x +=dx;

p-> y +=dy;

}

`` `

3. napodobňovanie dedičstva:

- kompozícia: Vložte štruktúru do inej štruktúry. To vám dáva vzťah „HAS-A“ (napr. „CAR“ má „motor“).

`` C

typedef struct {

int Horsepower;

// ...

} Motor;

typedef struct {

Motor motora; // auto * has-a * motor

int num_wheels;

} Auto;

`` `

- "dedičstvo" (manuálne): Zahrňte základnú štruktúru ako prvý člen odvodenej štruktúry. To zaisťuje, že členovia základnej štruktúry sú usporiadaní v pamäti pred odvodenými členmi štruktúry. Potom môžete odvodenú štruktúru odvodiť na ukazovateľ na základnú štruktúru (ale vyžaduje si to starostlivú správu pamäte a je náchylné na chyby).

`` C

typedef struct {

šírka int;

výška int;

} Obdĺžnik;

typedef struct {

Obdĺžnik; // „zdedí“ od obdĺžnika (prvý člen)

int farba;

} ColoredRectangle;

neplatné printRectanglearerea (obdĺžnik *rect) {

printf ("Area:%d \ n", rect-> šírka * rect-> výška);

}

ColoredRectangle Cr ={{10, 5}, 0xff0000}; // Inicializujte vnorenú štruktúru

Printrectanglearerea ((obdĺžnik*) &cr); // Platné, pretože obdĺžnik je prvý v pamäti

`` `

4. Faking Polymorfizmus:

- Použite ukazovatele funkcií v rámci štruktúry na nasmerovanie na rôzne implementácie tej istej funkcie na základe typu objektu. Je to podobné ako v prípade stratégie. Musíte ručne udržiavať tabuľku funkčných ukazovateľov.

`` C

Typedef Struct Shat {

int x;

int y;

void (*kreslenie) (tvar štruktúry*); // Funkcia ukazovateľa na kreslenie

} Tvar;

void drawCircle (tvar *s) {

printf ("kreslenie kruhu pri ( %d, %d) \ n", s-> x, s-> y);

}

neplatné kreslenie (tvar *s) {

printf ("kreslenie štvorca pri ( %d, %d) \ n", s-> x, s-> y);

}

Tvarový kruh ={10, 20, drawCircle};

Shape Square ={30, 40, DrawSquare};

Circle.Draw (&Circle); // Hovory DrawCircle

Square.Draw (&Square); // Hovory Drawsquare

`` `

5. MANUÁLNE MAMELICKEJ MANAGE:

- Keďže štruktúry C nemajú konštruktory a deštruktory, musíte starostlivo zvládnuť pridelenie pamäte a deaktiváciu pomocou „Malloc` a„ Free “. Ak tak neurobíte, povedie k úniku pamäte.

v súhrne:

- C štruktúry sú jednoduchšie dátové štruktúry s obmedzenými funkciami. Sú vhodné pre situácie, keď potrebujete iba zoskupovať súvisiace údaje.

- Triedy C ++ poskytujú výkonné funkcie pre objektovo orientované programovanie, vrátane zapuzdrenia, dedičnosti, polymorfizmu, konštruktorov, deštruktorov, preťaženia operátorov a šablón.

-Zatiaľ čo vy * môžete * implementovať objektovo orientované koncepty v C pomocou štruktúr, funkčných ukazovateľov a manuálnej správy pamäte, je výrazne zložitejšie, náchylnejšie na chyby a menej udržiavateľné ako pomocou tried C ++. V podstate prehodnocujete funkcie, ktoré C ++ poskytuje natívne.

Kedy používať C štruktúry namiesto tried C ++

Existujú určité situácie, keď by mohlo byť prospešné použitie štruktúry C, dokonca aj v programe C ++:

1. obyčajné staré údaje (pod) typy: Ak máte jednoduchú dátovú štruktúru, ktorá obsahuje iba údaje a nevyžaduje žiadne metódy alebo špeciálne správanie, štruktúra POD môže byť efektívnejšia. Štruktúra POD môže byť triviálne skopírovaná, porovnaná a serializovaná bez špeciálneho kódu. C ++ ponúka `STD ::IS_TRIVial` a` STD ::IS_Standard_layout` TYPE ZARIADENIA, aby ste určili, či má typ tieto vlastnosti.

2. Interoperability s kódom C: Ak potrebujete prepojiť sa s existujúcim kódom C, používanie štruktúr C je často najjednoduchším spôsobom, ako odovzdávať údaje medzi týmito dvoma jazykmi. C ++ môže priamo používať C štruktúry, zatiaľ čo triedy C ++ s komplexnými funkciami (ako sú konštruktory, virtuálne funkcie atď.) Nie sú priamo kompatibilné s C.

3. Abstrakcia programovania/hardvéru: Pri programovaní na nízkej úrovni (napr. Ovládače zariadení, zabudované systémy) možno budete musieť presne ovládať rozloženie pamäte vašich dátových štruktúr. C štruktúry vám poskytujú väčšiu kontrolu nad tým v porovnaní s triedami C ++, kde kompilátor môže pridať skrytých členov (napríklad ukazovateľ tabuľky virtuálnej funkcie).

4. Performance-kritické sekcie: Aj keď moderné kompilátory C ++ sú vysoko optimalizované, štruktúry POD môžu niekedy ponúknuť miernu výhodu výkonu vo veľmi kritických častiach kódu, pretože im chýba režijné náklady spojené s triedami (napríklad volania virtuálnych funkcií). *Avšak*, tento rozdiel je často zanedbateľný a dobrý kód C ++ sa môže fungovať rovnako dobre, ak nie lepší.

Na záver :

Zatiaľ čo C môže simulovať objektovo orientované princípy, C ++ je navrhnutý tak, aby ich priamo uľahčil. C ++ ponúka výkonnejšie nástroje na zapuzdrenie, dedičstvo a polymorfizmus, zjednodušenie objektovo orientovaného dizajnu v porovnaní s manuálnejším prístupom vyžadovaným v C. Ak váš projekt má úžitok z základných princípov OOP, C ++ je vhodnejšia voľba. C štruktúry sa najlepšie používajú v projektoch C ++, keď je potrebná priama interakcia kódu C alebo pri vytváraní čisto štruktúr zameraných na dáta.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené