Vizsgáljuk meg a másolószerkezet és a hozzárendelési operátor közötti különbséget.
Összehasonlító táblázat
Az összehasonlítás alapja | Másolószerkezet | Feladatkezelő |
---|---|---|
Alapvető | A másolószerkezet túlterhelt kivitelező. | A hozzárendelési operátor egy bitenkénti operátor. |
Jelentés | A másolószerkezet inicializálja az új objektumot egy már létező objektummal. | A hozzárendelési operátor egy objektum értékét egy másik objektumhoz rendeli, amelyek mindkettő már létezik. |
Szintaxis | class_name (cont class_name & object_name) { // a kivitelező teste } | osztály_név Ob1, Ob2; OB2 = OB1; |
meghívja | (1) A másolószerkezet akkor indít, ha egy új objektumot már létezővel inicializálunk. (2) Az objektum nem referencia paraméterként továbbított egy függvénynek. (3) Az objektum visszaáll a funkcióból. | A hozzárendelési operátort csak akkor kapja meg, ha új objektumot rendel a meglévő objektumhoz. |
Memóriaelosztás | Mind a célobjektum, mind az inicializáló objektum megosztja a különböző memóriahelyeket. | Mind a célobjektum, mind az inicializáló objektum megosztott memóriát oszt meg. |
Alapértelmezett | Ha a programban nem definiál másolatot készítőt, a C ++ fordító implicit módon biztosít egyet. | Ha nem terheli túl a "=" operátort, akkor egy bitenkénti másolat készül. |
A másolószerkezet meghatározása
A „másolószerkezet” egy túlterhelt kivitelező formája. A másoló-konstruktort csak inicializálás céljából hívják vagy hívják meg. A másolószerkezet egy újonnan létrehozott objektumot inicializál egy másik létező objektummal. Amikor egy másolószerkezetet használnak az újonnan létrehozott célobjektum inicializálására, akkor mind a célobjektum, mind a forrásobjektum különböző memóriahelyet oszt meg. A forrásobjektumban végrehajtott változtatások nem tükröződnek a célobjektumban. A másolószerkezet általános formája
class_ name (class_name & object_name) {. // a másolószerkezet szerve. } // objektum_neve az inicializálás jobb oldalán lévő objektumra utal.
Ha a programozó nem hoz létre másoló konstruktort egy C ++ programban, akkor a fordító implicit módon egy másolószerkezőt biztosít. A fordító által biztosított implicit másolási konstruktor a forrásobjektum tag-bölcs másolatát adja. Néha azonban a tag-bölcs másolat nem elégséges, mivel az objektum egy mutatóváltozót tartalmazhat. Egy mutatóváltozó eszközt másolva átmásoljuk a mutatóváltozóban tárolt címet, de nem akarjuk a mutatóváltozóban tárolt címet másolni, hanem azt szeretnénk másolni, hogy melyik mutató mutat. Ezért szükség van a programban kifejezett „másolati konstrukcióra”, hogy megoldja az ilyen jellegű problémákat.
A másolati konstrukciót három feltétel szerint hívják fel:
- A másolás-konstruktor meghívja, ha egy új objektumot már létezővel inicializálunk.
- Az objektum nem referencia paraméterként továbbított egy függvényhez.
- Az objektum visszaáll a funkcióból.
Egy példával megértjük a másolatot készítőt.
class copy {int num; public: copy () {} // alapértelmezett konstruktor másolat (int a) {// inicializáló konstruktor num = a; } másolat (másolás & c) {// Konstruktor másolása num = c.num; } void show () {cout << num; }}; int main () {A másolat (200); // Objektum A létrehozott és inicializált B (A) másolat; // Másolat C = A; // Másolatot készítő D-példány; D = A; // nem másolt konstrukció, mert a D objektum nem újonnan létrehozott objektum. // hozzárendelési művelet. vissza 0; }
A fenti kódban kifejezetten kijelentettem egy kivitelező „példányát (másolat & c)”. Ezt a másolatot készítőt hívják meg, ha a B objektumot az A. objektum segítségével inicializáljuk. Második alkalommal, amikor C objektumot inicializálunk az A objektummal. már létezik, nem az újonnan létrehozott. Ezért itt a hozzárendelési operátort hívják meg.
A megbízás meghatározása
A hozzárendelési operátor a C ++ hozzárendelő operátora. A „=” operátor a hozzárendelési operátor hívására szolgál. Az adatokat egy objektumban másolja a másik objektumhoz. A hozzárendelési operátor egy objektumot egy másik tag felé másol. Ha nem terheli túl a hozzárendelési operátort, akkor végrehajtja a bitenkénti másolatot. Ezért meg kell terhelni a hozzárendelési operátort.
class copy {int num; public: copy () {} // alapértelmezett konstruktor másolat (int a) {// inicializáló konstruktor num = a; } void show () {cout << num; }}; int main () {A másolat (200); // Objektum A létrehozott és inicializált B (300) másolat; // Objektum B létrehozva és inicializálva B = A; // hozzárendelési operátor C példányt hívott; C = A; // hozzárendelési operátor hívott vissza 0; }
A fenti kódban, amikor az objektumot a B objektumhoz hozzárendelik, a hozzárendelési operátor meghívásra kerül, mivel mindkét objektum már létezik. Hasonlóképpen ugyanaz a helyzet, amikor a C objektumot A. objektummal inicializáljuk.
Amikor a bitenkénti hozzárendelés végrehajtásra kerül, mind az objektum ugyanazon memóriahelyet osztja meg, és az egyik objektumban lévő változások más objektumban tükröződnek.
A másolási konstrukció és a hozzárendelési operátor közötti különbségek
- A másolószerkezet egy túlterhelt kontaktor, ahol hozzárendelési operátorként egy bitenkénti operátor.
- A másolási konstrukció segítségével új objektumot inicializálhat egy már létező objektummal. Másrészt, egy hozzárendelési operátor másol egy objektumot a másik objektumra, amelyek mindkettő már létezik.
- A másolószerkezet inicializálása megtörténik, ha egy új objektumot már létező objektummal inicializálunk, amikor egy objektumot nem refrencia paraméterként továbbítunk egy függvényre, vagy ha egy objektumot egy függvényből visszaküldünk. Másrészről egy hozzárendelési operátort csak akkor hívnak meg, ha egy objektumot egy másik objektumhoz rendelnek.
- Amikor egy objektumot másolás-konstruktorral inicializálunk, az inicializáló objektum és az inicializált objektum megosztja a különböző memóriahelyeket. Másrészt, ha egy objektumot hozzárendelési operátor segítségével inicializálunk, akkor az inicializált és inicializáló objektumok azonos memóriahelyet osztanak meg.
- Ha nem határozza meg kifejezetten a másolószerkezetet, akkor a fordító biztosítja azt. Másrészről, ha nem terhel egy túlméretező operátort, akkor egy bitenkénti másolási műveletet hajt végre.
Következtetés:
A Másolás konstruktor a legjobb, ha egy objektumot másol, ha az objektum nyers mutatókat tartalmaz.