Рецоммендед, 2020

Избор Уредника

Разлика између конструктора копирања и оператора доделе у Ц ++

Копирање конструктора и оператора додјеле, два су начина за иницијализацију једног објекта помоћу другог објекта. Основна разлика између конструктора копирања и оператора додјеле је да конструктор копирања додјељује засебну меморију објема објектима, тј. Ново створеном циљном објекту и изворном објекту. Оператор додјеле додјељује исту меморијску локацију новонасталом циљном објекту као и изворни објекат.

Проучимо разлику између конструктора копирања и оператора додјеле.

Цомпарисон Цхарт

Основа за поређењеЦопи ЦонструцторОператор доделе
БасицКонструктор копирања је преоптерећен конструктор.Оператор доделе је битни оператор.
ЗначењеКонструктор копирања иницира нови објекат већ постојећим објектом.Оператор додељивања додељује вредност једног објекта другом објекту који већ постоји.
Синтаксацласс_наме (цонт цласс_наме & објецт_наме) {
// тело конструктора
}
цласс_наме Об1, Об2;
Об2 = Об1;
Инвокес(1) Конструктор копирања позива када се нови објекат иницијализује са постојећим.
(2) Објект је прослеђен функцији као нереферентни параметар.
(3) Објект се враћа из функције.
Оператор доделе се позива само када се постојећем објекту додели нови објекат.
Додела меморијеИ циљни објект и објект иницијализације дијеле различите меморијске локације.И циљни објекат и објекат иницијализације деле исту додељену меморију.
УобичајеноАко не дефинишете било који конструктор копирања у програму, Ц ++ преводилац имплицитно даје један.Ако не преоптеретите "=" оператора, бит ће направљена битна копија.

Дефиниција Цопи Цонструцтор-а

"Копирни конструктор" је облик преоптерећеног конструктора . Конструктор копирања је позван или позван само за сврху иницијализације. Конструктор копирања иницира ново створени објекат помоћу другог постојећег објекта. Када се конструктор копирања користи за иницијализацију ново створеног циљног објекта, онда и циљни објект и изворни објект дијеле различите меморијске локације. Промене извршене на изворном објекту не одражавају се у циљном објекту. Општи облик конструктора копирања је

 име класе (име класе и име објекта) {. // тело конструктора копирања. } // објецт_наме се односи на објекат на десној страни иницијализације. 

Ако програмер не креира конструктор копирања у Ц ++ програму, онда компајлер имплицитно даје конструктор копирања. Имплицитни конструктор копирања који обезбеђује компајлер ради копију изворног објекта. Али, понекад копија по члану није довољна, јер објекат може да садржи променљиву показивача. Копирајући променљиву показивача, копирамо адресу сачувану у променљивој показивачу, али не желимо да копирамо адресу сачувану у променљивој показивачу, уместо тога желимо да копирамо на шта показује показивач. Дакле, постоји потреба за експлицитним 'конструктом копирања' у програму за рјешавање оваквих проблема.

Конструктор копирања се позива у три услова као што следи:

  • Конструктор копирања позива када се нови објекат иницијализује са постојећим.
  • Објект је прослеђен функцији као нереферентни параметар.
  • Објекат се враћа из функције.

Размотримо конструктор копирања са примером.

 цласс цопи {инт нум; публиц: цопи () {} // дефаулт конструктор цопи (инт а) {// иницирајући конструктор нум = а; } цопи (цопи & ц) {// Копирај конструктор нум = ц.нум; } воид схов () {цоут << нум; }}; инт маин () {копија А (200); // Објекат А креирана и иницијализована копија Б (А); // Копирај конструктор назван копија Ц = А; // Копирај конструктор назван копија Д; Д = А; // конструктор копирања се не зове јер објект Д није новокреирани објекат. // то је операција додјеле. ретурн 0; } 

У горе наведеном коду, експлицитно сам декларисао конструктора "цопи (цопи & ц)". Овај конструктор копирања се позива када је објекат Б иницијализован коришћењем објекта А. Други пут када се објекат Ц иницијализује помоћу објекта А. Када је објекат Д иницијализован коришћењем објекта А, конструктор копирања се не позива зато што се Д иницијализује она је већ у постојању, а не у новоствореној. Дакле, овде се позива оператор преноса.

Дефиниција оператора додјеле

Оператор доделе је оператор који додељује Ц ++. Оператор "=" се користи за позивање оператора додјеле. Копира податке у један објекат идентично другом објекту. Оператор задатка копира један објекат другом члану. Ако не преоптерете оператора доделе, он извршава копију битова. Стога, морате преоптеретити оператора додјеле.

 цласс цопи {инт нум; публиц: цопи () {} // дефаулт конструктор цопи (инт а) {// иницирајући конструктор нум = а; } воид схов () {цоут << нум; }}; инт маин () {копија А (200); // Објекат А креирана и иницијализована копија Б (300); // Објекат Б креиран и иницијализован Б = А; // оператер доделе позива Ц; Ц = А; // оператер додељивања позван повратак 0; } 

У горе наведеном коду када је објект А додељен објекту Б, оператер додељивања се позива, пошто оба објекта већ постоје. Слично томе, исти је случај када је објекат Ц иницијализован објектом А.

Када је извршена битна додела, објекат дели исту меморијску локацију и промене у једном објекту одражавају се у другом објекту.

Кључне разлике између конструктора копирања и оператора додјеле

  1. Конструктор копирања је преоптерећен контруктор где је као оператер доделе битни оператор.
  2. Користећи конструктор копирања, можете иницијализовати нови објекат са већ постојећим објектом. С друге стране, оператер додељивања копира један објекат на други објекат, који већ постоји.
  3. Конструкција копије се иницијализује кад год се нови објекат иницијализује са већ постојећим објектом, када се објекат проследи функцији као параметар без рефренца, или када се објекат врати из функције. С друге стране, оператор доделе се позива само када се објекат додели другом објекту.
  4. Када се објекат иницијализује помоћу конструктора копирања, објекат иницијализације и иницијализовани објекат деле различиту меморијску локацију. С друге стране, када се објекат иницијализује помоћу оператора доделе, иницијализовани и иницијализовани објекти деле исту меморијску локацију.
  5. Ако експлицитно не дефинишете конструктор копирања, компајлер је обезбеђује. С друге стране, ако не преоптеретите оператора ассигмента онда се извршава операција копирања битова.

Закључак:

Конструктор Копирај је најбољи за копирање једног објекта у други када објекат садржи сирове показиваче.

Top