Suositeltava, 2024

Toimituksen Valinta

Kopiointirakentajan ja tehtävän operaattorin välinen ero C ++: ssa

Kopioi rakentaja ja toimeksianto-operaattori ovat kaksi tapaa alustaa yksi objekti toisen objektin avulla. Perusero kopiokoneen rakentajan ja toimeksianto-operaattorin välillä on se, että kopioinnin rakentaja allokoi erillisen muistin molemmille kohteille, ts. Vasta luotu kohdeobjekti ja lähdeobjekti. lähdeobjekti.

Tutkitaan eroa kopiointi- ja luovutusoperaattorin välillä.

Vertailukaavio

Vertailun perusteetKopioi rakentajaToimeksiantaja
perustiedotKopionrakentaja on ylikuormitettu rakentaja.Tehtäväoperaattori on bittinen operaattori.
merkitysKopioi-konstruktori alustaa uuden objektin jo olemassa olevalla objektilla.Tehtäväoperaattori määrittää yhden kohteen arvon toiselle objektille, jotka molemmat ovat jo olemassa.
Syntaksiluokan_nimi (jatko-luokan nimi ja objektin_nimi) {
// rakentajan runko
}
luokan_nimi Ob1, Ob2;
Ob2 = Obl 1;
vetoaa(1) Kopiointikonstruktori käynnistää uuden objektin alustamisen olemassa olevalla.
(2) Objekti siirretään funktioksi ei-referenssinä.
(3) Objekti palautetaan toiminnosta.
Tehtäväoperaattori kutsutaan vain, kun määritetään olemassa oleva objekti uudelle objektille.
Muistin jakaminenSekä kohdeobjekti että alustava kohde jakavat eri muistipaikkoja.Sekä kohdeobjekti että alustava objekti jakavat saman varatun muistin.
oletusarvoJos et määritä mitään kopiointitekijää ohjelmassa, C ++-kääntäjä tarjoaa epäsuorasti yhden.Jos et ylikuormita "=" -käyttäjää, tehdään bittinen kopio.

Määritelmä kopionrakentajalle

”Kopiokoneen rakentaja” on ylikuormitetun konstruktorin muoto . Kopiointikonstruktoria kutsutaan tai kutsutaan vain alustustarkoitukseen. Kopiointikonstruktori alustaa uuden luodun objektin toisella olemassa olevalla objektilla. Kun kopio-konstruktoria käytetään vasta perustetun kohdeobjektin alustamiseen, niin kohdeobjekti ja lähdeobjekti jakavat eri muistipaikkaa. Lähdeobjektin muutokset eivät heijasta kohdeobjektissa. Kopionrakentajan yleinen muoto on

 luokan_nimi (luokan_nimi ja objektin_nimi) {. // kopionrakentajan laitos. } // objektin_nimi viittaa alkuasetuksen oikealla puolella olevaan kohteeseen. 

Jos ohjelmoija ei luo kopiointikonstruktoria C ++ -ohjelmassa, kääntäjä tarjoaa epäsuorasti kopiointitekijän. Kääntäjän toimittama implisiittinen kopiointirakentaja tekee lähdeobjektin jäsen-viisas kopion. Mutta joskus jäsen-viisas kopio ei riitä, koska objekti voi sisältää osoitinmuuttujan. Kopioimalla osoitinmuuttuja tarkoittaa, että kopioimme osoitteen muuttujaan tallennetun osoitteen, mutta emme halua kopioida osoitteen muuttujaan tallennettua osoitetta, vaan haluamme kopioida mitä osoitin osoittaa. Tästä syystä ohjelmassa on tarvetta nimenomaan kopioida rakentajaa tällaisten ongelmien ratkaisemiseksi.

Kopioinnin rakentajaa vedotaan kolmella ehdolla seuraavasti:

  • Kopioi rakentaja kutsuu, kun uusi objekti alustetaan olemassa olevalla.
  • Objekti siirrettiin funktioksi ei-referenssiparametrina.
  • Objekti palautetaan toiminnosta.

Ymmärtäkäämme kopionrakentaja esimerkin avulla.

 luokan kopio {int num; public: copy () {} // oletusrakentajan kopio (int a) {// alustajan num = a alustaminen; } kopio (kopio & c) {// Kopioi konstruktori num = c.num; } void show () {cout << num; }}; int main () {kopio A (200); // Object A luotu ja alustettu kopio B (A); // Kopioi rakentaja kopio C = A; // Kopioi rakentaja kopio D; D = A; // kopionrakentajaa ei ole kutsuttu, koska objekti D ei ole hiljattain luotu objekti. // se on toimeksianto. paluu 0; } 

Yllä olevassa koodissa olin nimenomaisesti ilmoittanut rakentajan ”kopion (kopio ja c)”. Tätä kopiointitekijää kutsutaan, kun objekti B alustetaan objektilla A. Toinen kerta, kun sitä kutsutaan, kun objektia C alustetaan objektilla A. Kun objekti D alustetaan objektin A avulla, kopiointituottajaa ei kutsuta, koska kun D alustetaan se on jo olemassa, ei vasta luotu. Tällöin kutsutaan operaattorikäyttäjä.

Toimeksiantajan määritelmä

Tehtäväoperaattori on C ++: n määrittävä operaattori. ”=” -Käyttäjää käytetään osoittamaan operaattorin. Se kopioi tiedot yhdessä kohteessa identtisesti toiseen kohteeseen. Tehtäväoperaattori kopioi yhden kohteen toiseen jäseneen. Jos et ylikuormita osoittajaoperaattoria, se suorittaa bittikopion. Siksi sinun täytyy ylikuormittaa osoittajaoperaattori.

 luokan kopio {int num; public: copy () {} // oletusrakentajan kopio (int a) {// alustajan num = a alustaminen; } void show () {cout << num; }}; int main () {kopio A (200); // Object A luotu ja alustettu kopio B (300); // Objekti B on luotu ja alustettu B = A; // osoituskäyttäjä käytti kopiota C; C = A; // siirto-operaattori vetoaa palautukseen 0; } 

Yllä olevassa koodissa, kun objektille B on annettu objektiA, kutsutaan operaattoria, koska molemmat objektit ovat jo olemassa. Samoin on sama, kun kohde C alustetaan objektilla A.

Kun bittikohdistus suoritetaan, niin objektilla on sama muistipaikka ja yhden objektin muutokset heijastuvat toiseen kohteeseen.

Kopionrakentajan ja toimeksiantajan keskeiset erot

  1. Kopiointikonstruktori on ylikuormitettu kontuuri, jossa kohdistusoperaattorina on bittinen operaattori.
  2. Kopiointikonstruktorin avulla voit alustaa uuden objektin jo olemassa olevalla objektilla. Toisaalta osoittajaoperaattori kopioi yhden kohteen toiseen kohteeseen, jotka molemmat ovat jo olemassa.
  3. Kopiointikonstruktori alustetaan aina, kun uusi objekti alustetaan jo olemassa olevalla objektilla, kun objekti siirretään funktiolle ei-refrenssi-parametrina tai kun objekti palautetaan toiminnosta. Toisaalta osoittajaoperaattori kutsutaan vain, kun objekti on osoitettu toiselle objektille.
  4. Kun objektia alustetaan kopiokoneen konstruktorilla, alustava kohde ja alustettu kohde jakavat eri muistipaikkaa. Toisaalta, kun objektia alustetaan käyttämällä osoittajaoperaattoria, alustetut ja alustavat objektit jakavat saman muistipaikan.
  5. Jos et määrittele kopiointimuotoa nimenomaisesti, kääntäjä antaa sen. Toisaalta, jos et ylikuormita assigmenttioperaattoria, suoritetaan bittinen kopiointi.

johtopäätös:

Kopioi-konstruktori on paras kopioimaan yksi objekti toiseen, kun objekti sisältää raakoja osoittimia.

Top