Ieteicams, 2024

Redaktora Izvēle

Atšķirība starp kopēšanas konstruktoru un uzdevuma operatoru C ++

Kopēšanas konstruktors un piešķiršanas operators ir divi veidi, kā inicializēt vienu objektu, izmantojot citu objektu. Galvenā atšķirība starp kopēšanas konstruktoru un piešķiršanas operatoru ir tā, ka kopēšanas konstruktors piešķir atsevišķu atmiņu gan objektiem, ti, jaunizveidotajam mērķa objektam, gan avota objektam. Piešķiršanas operators piešķir to pašu atmiņas vietu jaunizveidotajam mērķa objektam, kā arī avota objekts.

Izpētīsim atšķirību starp kopēšanas konstruktoru un piešķiršanas operatoru.

Salīdzinājuma diagramma

Salīdzinājuma pamatsKopēšanas konstruktorsPiešķiršanas operators
PamataKopēšanas konstruktors ir pārslogots konstruktors.Piešķiršanas operators ir bitu operators.
NozīmeKopēšanas konstruktors inicializē jauno objektu ar jau esošu objektu.Piešķiršanas operators piešķir viena objekta vērtību citam objektam, kas jau pastāv.
Sintakseklases_nosaukums (cont class_name & object_name) {
// konstruktora struktūra
}
klases nosaukums Ob1, Ob2;
Ob2 = Ob1;
Izsauc(1) Kopēšanas konstruktors atsaucas, kad jauns objekts tiek inicializēts ar esošo.
(2) Objekts nodots funkcijai kā neparedzēts parametrs.
(3) Objekts tiek atgriezts no funkcijas.
Piešķiršanas operators tiek izmantots tikai tad, ja esošajam objektam tiek piešķirts jauns objekts.
Atmiņas piešķiršanaGan mērķa objektam, gan sākotnējam objektam ir dažādas atmiņas vietas.Gan mērķa objekts, gan inicializētais objekts dala to pašu piešķirto atmiņu.
NoklusējumsJa programmā nav definēts neviens kopēšanas konstruktors, C ++ kompilators netieši nodrošina vienu.Ja jūs neuzlādējiet operatoru "=", tad tiks veikta bitu kopija.

Kopēšanas konstruktora definīcija

“Kopēšanas konstruktors” ir pārslogota konstruktora forma. Kopēšanas konstruktors tiek izsaukts vai izmantots tikai inicializācijas nolūkā. Kopēšanas konstruktors inicializē jaunizveidoto objektu ar citu esošu objektu. Ja kopēšanas konstruktors tiek izmantots, lai inicializētu jaunizveidoto mērķa objektu, tad gan mērķa objekts, gan avota objekts dalās dažādās atmiņas vietās. Izmaiņas, kas izdarītas avota objektā, neatspoguļo mērķa objektā. Kopējā konstruktora forma ir

 klases_nosaukums (klases nosaukums un objekta nosaukums) {. // kopēšanas konstruktora struktūra. } // Object_name attiecas uz objektu inicializācijas labajā pusē. 

Ja programmētājs C ++ programmā neizveido kopēšanas konstruktoru, tad kompilators netieši nodrošina kopēšanas konstruktoru. Kompilatora nodrošinātais netiešās kopēšanas konstruktors veic avota objekta kopiju. Taču dažreiz nepietiek ar biedru gudru kopiju, jo objekts var saturēt rādītāja mainīgo. Kopējot rādītāja mainīgos līdzekļus, mēs kopējam rādītāju mainīgajā adresē saglabāto adresi, bet mēs nevēlamies kopēt rādītāju mainīgajā adresē saglabāto adresi, bet mēs vēlamies kopēt to, kas norāda rādītāju. Līdz ar to, lai atrisinātu šāda veida problēmas, programmā ir nepieciešams skaidri formulēts “kopēšanas konstruktors”.

Kopētāja konstruktors tiek izmantots šādos trīs apstākļos:

  • Kopēšanas konstruktors atsaucas, kad jauns objekts tiek inicializēts ar esošo.
  • Objekts tika nodots funkcijai kā neparedzēts parametrs.
  • Objekts tiek atgriezts no funkcijas.

Sapratīsim kopijas konstruktoru ar piemēru.

 klases kopija {int num; public: copy () {} // noklusējuma konstruktora kopija (int a) {// iniciatores num = a; } kopija (kopija un c) {// Kopēt konstruktora numuru = c.num; } void show () {cout << num; }}; int main () {A kopija (200); // Objekts Izveidota un inicializēta B (A) kopija; // Kopēt konstruktoru, ko sauc par kopiju C = A; // Kopēt konstruktoru, ko sauc par kopiju D; D = A; / / kopiju konstruktors nav izsaukts, jo objekts D nav tikko izveidots objekts. // tā ir piešķiršanas operācija. atgriešanās 0; } 

Iepriekš minētajā kodā es skaidri paziņoju par konstruktora “kopiju (kopiju un c)”. Šo kopēšanas konstruktoru sauc, kad B objektu inicializē, izmantojot objektu A. Otro reizi to sauc, kad objektu C inicializē, izmantojot objektu A. Ja objekts D tiek inicializēts, izmantojot objektu A, kopēšanas konstruktors netiek izsaukts, jo, kad tiek inicializēts D tā jau pastāv, nevis jaunizveidotā. Tādējādi šeit tiek izmantots uzdevuma operators.

Piešķiršanas operatora definīcija

Piešķiršanas operators ir C + + piešķīrējs. Operatora “=” izmantošana tiek izmantota, lai izsauktu uzdevuma operatoru. Tas kopē datus vienā objektā identiski citam objektam. Piešķiršanas operators vienu objektu kopē ar citu dalībnieku. Ja nenotiek pārslodzes piešķiršanas operators, tas veic bitu kopiju. Tādēļ jums ir nepieciešams pārslogot uzdevuma operatoru.

 klases kopija {int num; public: copy () {} // noklusējuma konstruktora kopija (int a) {// iniciatores num = a; } void show () {cout << num; }}; int main () {A kopija (200); // Objekts Izveidota un inicializēta B kopija (300); // Objekts B ir izveidots un inicializēts B = A; // uzdevuma operators izmantoja C kopiju; C = A; // uzdevuma operators atsaucas atpakaļ 0; } 

Iepriekš minētajā kodā, kad objektam B ir piešķirts objekts B, uzdevuma operators tiek izmantots, jo abi objekti jau pastāv. Tāpat tas pats ir gadījums, kad objekts C tiek inicializēts ar objektu A.

Kad tiek veikts bitbitu uzdevums, gan objektam ir vienāda atmiņas vieta, gan izmaiņas vienā objektā atspoguļojas citā objektā.

Galvenās atšķirības starp kopēšanas konstruktoru un uzdevuma operatoru

  1. Kopēšanas konstruktors ir pārslogots kontūrs, kur kā piešķīruma operators ir bitu griezējs.
  2. Izmantojot kopēšanas konstruktoru, varat inicializēt jaunu objektu ar jau esošu objektu. No otras puses, cesijas operators kopē vienu objektu uz otru objektu, kas abi jau ir.
  3. Kopēšanas konstruktors tiek inicializēts ikreiz, kad jauns objekts tiek inicializēts ar jau esošu objektu, kad objekts tiek nodots funkcijai kā nenorādīšanas parametrs vai kad objekts tiek atgriezts no funkcijas. No otras puses, piešķiršanas operators tiek izmantots tikai tad, ja objekts tiek piešķirts citam objektam.
  4. Kad objektu inicializē, izmantojot kopēšanas konstruktoru, inicializētais objekts un inicializētais objekts dalās ar atšķirīgu atmiņas vietu. No otras puses, kad objektu inicializē, izmantojot piešķiršanas operatoru, inicializētajiem un inicializējošajiem objektiem ir tāda pati atmiņas vieta.
  5. Ja jūs nepārprotami definējat kopēšanas konstruktoru, kompilators nodrošina to. No otras puses, ja jums nav pārslodzes assigment operatoram, tad tiek veikta bitu kopēšanas operācija.

Secinājums:

Kopēšanas konstruktors ir labākais, lai kopētu vienu objektu uz citu, ja objektā ir neapstrādātas norādes.

Top