7.1. Constructori¶

Toate tipurile definite de utilizator includ un constructor. Chiar dacă nu scrieți unul explicit, compilatorul va scrie unul pentru dvs. Pentru majoritatea claselor și structurilor văzute până acum, lăsăm compilatorul să genereze constructorii impliciți pentru noi.

constructorul implicit

Constructorul implicit poate fi suprasolicitat ca orice altă funcție. Când vă proiectați tipurile, puteți crea constructori cu unul, două sau mai multe argumente, după caz.

Compilatorul o va face nu generăm un constructor implicit dacă scriem altele care nu sunt implicite. Compilatorul poate crea în continuare alte operații implicite.

Deci, în timp ce acest lucru este în regulă:

Putem inițializa punctul nostru numai folosind constructorul implicit.

Dacă dorim să inițializăm membrii clasei la momentul construcției, atunci trebuie să adăugăm constructori personalizați.

Acum putem folosi constructorul nostru cu 2 argumente, dar acum vechea noastră invocare implicită este ruptă. Veți vedea și veți greși astfel:

Acest lucru este fixat de:

Scrierea propriei noastre implementări implicite

Spunându-i compilatorului să o scrie

Spunându-i compilatorului să-l șteargă

În acest caz, încercarea de a utiliza constructorul implicit este încă o eroare de compilare, dar eroarea este mai explicită: nu o puteți folosi deoarece a fost ștearsă.

Dacă scrieți un constructor non-implicit, atunci ar trebui să scrieți întotdeauna propriul constructor implicit sau să instruiți în mod explicit compilatorul să îl facă pentru dvs. sau să îl ștergeți.

În general, aveți grijă să ștergeți constructorul implicit. Ștergeți-l numai atunci când sunteți sigur că vor face obiectele clasei nu trebuie să fie construit implicit.

7.1.1. Inițializare a sintaxei

Unii programatori care vin în C ++ din alte limbaje OO simt uneori că ar trebui să inițializeze obiecte de genul acesta:

Chiar dacă tot semestrul, scriai:

Când vine vorba de tipurile definite de utilizator, uneori se simte „incomplet” dacă nu includeți (). De obicei, aceste paranteze creează mai multe probleme decât rezolvă. Acest lucru se datorează unei ambiguități inerente în limbajul C ++. Deși ni se pare evident punctul de declarație p (); este un apel către constructorul implicit și rezultatele ar trebui să fie o nouă variabilă p, compilatorul o interpretează diferit.

Regula de bază este:

Aceasta înseamnă că în codul de mai sus, compilatorul caută în schimb:

o funcție numită p

care nu ia argumente

și returnează un obiect de tip punct

Deoarece în acest caz, nu există o astfel de funcție, aceasta returnează o eroare. Unii compilatori, cum ar fi clang, vor încerca să vă spună:

C ++ rezolvă această ambiguitate în C ++ 11 utilizând sintaxa uniformă a inițializatorului. Puteți utiliza paranteze: <> în loc de paranteze pentru a inițializa obiecte. Parantezele sunt o extensie a sintaxei listei de inițializatoare pentru containere și pot fi utilizate chiar și pentru obiectele construite implicit.