Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
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.