Scurt întrebări frecvente despre C ++
[Toate mărcile înregistrate menționate în acest document sunt proprietatea proprietarilor lor.]
[8.2] Ce se întâmplă ca rezultat al atribuirii unui link?
[8.3] Ce se întâmplă atunci când returnez un link din funcție?
[8.4] Cum pot reseta o referință pentru a se referi la un alt obiect?
[8.5] Când trebuie să folosesc linkuri și în ce cazuri să folosesc indicii?
SECȚIUNEA [9]: Funcții încorporate (inline)
[9.1] Care este funcția încorporată?
[9.2] Cum pot afecta funcțiile integrate raportul de siguranță-viteză?
[9.3] De ce să folosesc funcțiile încorporate? De ce nu utilizați doar #definite macrocomenzi?
[9.4] Ce pot face pentru a defini o funcție - nu este un membru al clasei ca fiind încorporat?
[9.5] Cum fac o funcție încorporată un membru al unei clase?
[9.6] Există un alt mod de a defini o funcție inline - un membru al clasei?
[9.7] Funcțiile încorporate îmbunătățesc în mod necesar performanța?
SECȚIUNEA [10]: proiectanți
[10.1] Ce sunt constructorii?
[10.3] Cum de a apela un alt constructor de la un constructor pentru a inițializa acest obiect?
[10.4] Este întotdeauna constructorul implicit arata ca un Fred :: Fred () la Fred?
[10.5] Care constructor va fi chemat dacă creez o serie de obiecte de tip Fred?
[10.6] În cazul în care constructorii mei folosesc "listele de inițializare" sau "atribuirea valorilor"?
[10.7] Pot folosi acest lucru în constructor?
[10.8] Ce este un "Idiom constructor numit"?
[10.9] De ce nu pot inițializa membru clasa statică în lista de constructor de inițializare?
[10.10] De ce clasele cu date statice primesc erori de aspect?
[10.11] Ce este fiasco-ul de inițializare statică?
[10.12] Cum se poate preveni o eroare în ordinea inițializării statice?
[10.13] Cum să ne ocupăm de erorile ordinii inițializării statice a obiectelor - membrii clasei?
[10.14] Cum rezolv eroarea care a avut loc în constructor?
ARZDEL [11]: Distrugătoare
[11.1] Ce este un distrugător?
[11.2] În ce ordine sunt numiți distrugătorii obiectelor locale?
[11.3] În ce ordine sunt numiți distrugătorii obiectelor de matrice?
[11.4] Pot reîncărca distrugătorul pentru clasa mea?
[11.5] Pot numi în mod explicit un destructor pentru o variabilă locală?
[11.6] Ce se întâmplă dacă vreau ca o variabilă locală să "moară" înainte de a închide brațul? Pot provoca un destructor pentru o variabilă locală dacă este absolut necesar?
[11.7] Ok, nu voi numi în mod explicit distrugătorul. Dar cum pot face față acestei probleme?
[11.8] Ce se întâmplă dacă nu pot pune o variabilă într-un bloc separat?
[11.9] Pot numi în mod explicit un destructor pentru un obiect creat cu un nou?
[11.10] Care este sintaxa "destinație nouă de plasare" și de ce este necesară?
[11.11] Când scriu un destructor, ar trebui să numesc în mod explicit distrugătorii pentru obiectele membre ale clasei mele?
[11.12] Când scriu un distrugător al unei clase derivate, trebuie să numesc în mod explicit distrugătorul strămoșului?
Legăturile sunt adesea folosite pentru a transmite un parametru prin referință:
În acest exemplu, i și j sunt aliasuri pentru variabilele x și y ale funcției principale. Cu alte cuvinte, i este x. Nu este un pointer la x și nu o copie a lui x. dar x în sine. Tot ce faci cu i. făcut cu x. și invers.
[8.2] Ce se întâmplă ca rezultat al atribuirii unui link?
[8.3] Ce se întâmplă atunci când returnez un link din funcție?
În acest caz, apelul funcției poate fi în partea stângă a operatorului de atribuire (operație).
La prima vedere, o astfel de înregistrare poate părea ciudată. De exemplu, scrierea f () = 7 pare lipsită de sens. Cu toate acestea, dacă a este un obiect Array. pentru majoritatea oamenilor înregistra un [i] = 7 este semnificativă, chiar dacă o [i] - aceasta este doar o deghizată de apel în funcție Array :: operatorului [] (int). care este operatorul de inversiune pentru indexul pentru clasa Array.
[8.4] Cum pot reseta o referință pentru a se referi la un alt obiect?
Imposibil în principiu.
Este imposibil să separați o referință de obiectul său.
[8.5] Când trebuie să folosesc linkuri și în ce cazuri să folosesc indicii?
Utilizați linkuri atunci când puteți și indicații când aveți nevoie de ele.
Link-uri sunt, în general, de preferat, atunci când indicii inutile ei „redirect“ [8.4]. Aceasta înseamnă, de obicei, că legăturile sunt deosebit de utile în partea publică a clasei. Legăturile apar de obicei pe suprafața obiectului, iar indicii sunt ascunși în interior.
Notă: programatorii cu experiență în C se referă adesea la dispreț, deoarece parametrul care trece prin referință nu este explicit indicat în codul de apel. Cu toate acestea, după ce a obținut o anumită experiență în C ++, ei sunt conștienți de faptul că este o formă de ascundere de informații, care este mai degrabă un avantaj decât un dezavantaj. Ie programator ar trebui să scrie cod în ceea ce privește problema, mai degrabă decât un calculator (programatori ar trebui să scrie cod în limba problemei, mai degrabă decât limba mașinii).
[9.1] Care este funcția încorporată?
Funcția încorporată este o funcție a cărei cod este inserat direct în locul în care se numește. Ca macrocomenzi definite prin #define. Funcțiile încorporate îmbunătățesc productivitatea costând apelul și (în special!) Datorită posibilității de optimizare suplimentară ("integrare procedurală").
[9.2] Cum pot afecta funcțiile integrate raportul de siguranță-viteză?
În C normal, puteți obține "structuri încapsulate" prin plasarea unui pointer în gol. și forțând-o să indice date reale, ale căror tipuri sunt necunoscute utilizatorilor structurii. Astfel, utilizatorii nu știu cum să interpreteze aceste date, iar funcțiile de acces convertesc pointerul la void la tipul ascuns dorit. Aceasta atinge un anumit nivel de încapsulare.
Din păcate, această metodă este contrară tipurilor de securitate, și necesită, de asemenea, un apel de funcție pentru a avea acces la toate câmpurile de structură (dacă aveți permisiunea de a avea acces direct, ar putea primi oricine, deoarece va ști cum să interpreteze datele care indică vidul *. Un astfel de comportament din partea utilizatorului va avea ca rezultat dificultăți în structura de date de schimbare subiect ulterioare).
Costul de a apela funcția este mic, dar dă o anumită creștere. Clasele C ++ permit integrarea funcțiilor, ceea ce vă oferă siguranța încapsulării împreună cu viteza accesului direct. Mai mult decât atât, tipurile de parametri sunt funcții inline sunt verificate de compilator, care este un avantaj în comparație cu (?) Macro-uri #define Sishnymi.
[9.3] De ce să folosesc funcțiile încorporate? De ce nu utilizați doar #definite macrocomenzi?
Deoarece #definite macro-uri sunt periculoase [9.3], periculoase [34.1], periculoase [34.2], sunt periculoase [34.3].
Spre deosebire de macro-uri #define, încorporate (inline) functiei imune la erori de calcul dublu cunoscute ca fiecare argument funcție încorporat este evaluată o singură dată. Cu alte cuvinte, apelarea unei funcții încorporate este aceeași cu apelarea unei funcții obișnuite, numai mai rapid:
De asemenea, spre deosebire de macrocomenzi, se verifică tipurile de argumente ale funcțiilor încorporate și se fac toate transformările necesare.
Macrorele sunt dăunătoare pentru sănătate; Nu le folosiți dacă nu este necesar