Tavsiye, 2024

Editörün Seçimi

C ++ 'ta Kopya Oluşturucu ile Atama Operatörü Arasındaki Fark

Kopya yapıcı ve atama operatörü, bir nesneyi başka bir nesneyle başlatmak için iki yoldur. Kopya yapıcısı ve atama operatörü arasındaki temel fark, kopya yapıcısının her iki nesneye, yani yeni oluşturulan hedef nesneye ve kaynak nesneye ayrı bellek ayırmasıdır. Atama operatörü, yeni oluşturulan hedef nesneye aynı hafıza konumunu tahsis eder. kaynak nesne.

Kopya kurucu ile atama operatörü arasındaki farkı inceleyelim.

Karşılaştırma Tablosu

Karşılaştırma için temelOluşturucu KopyalaAtama operatörü
TemelKopya yapıcı aşırı yüklenmiş bir yapıcıdır.Atama operatörü bitsel bir operatördür.
anlamCopy yapıcısı yeni nesneyi zaten mevcut bir nesneyle başlatır.Atama operatörü, her ikisi de zaten var olan bir nesnenin değerini başka bir nesneye atar.
Sözdizimiclass_name (cont sınıf_adı ve nesne_adı) {
// yapıcının gövdesi
}
sınıf_adı Ob1, Ob2;
= Ob1 Ob2;
çağırır(1) Kopya kurucu, yeni bir nesne mevcut olanla başlatıldığında çağırır.
(2) Nesne, referans olmayan bir parametre olarak bir işleve geçti.
(3) Nesne işlevden döndürülür.
Atama operatörü, yalnızca varolan nesneye yeni bir nesne atanırken çağrılır.
Hafıza TahsisiHem hedef nesne hem de başlangıç ​​nesnesi farklı bellek konumlarını paylaşır.Hem hedef nesne hem de başlangıç ​​nesnesi aynı ayrılmış belleği paylaşır.
VarsayılanProgramda herhangi bir kopya kurucusu tanımlamazsanız, C ++ derleyicisi örtük olarak bir tane sağlar."=" İşlecini aşırı yüklemezseniz, bit yönünde bir kopya oluşturulur.

Kopya Oluşturucu Tanımı

Bir “kopya kurucu”, aşırı yüklenmiş bir kurucunun bir şeklidir. Bir kopya kurucu sadece başlatma amacıyla çağrılır veya çağrılır. Bir copy yapıcısı, yeni oluşturulan nesneyi varolan başka bir nesne tarafından başlatır. Yeni oluşturulan hedef nesneyi başlatmak için bir kopya kurucu kullanıldığında, hem hedef nesne hem de kaynak nesne farklı bellek konumlarını paylaşır. Kaynak nesneye yapılan değişiklikler, hedef nesneye yansıtmaz. Kopya kurucunun genel biçimi

 class_ name (sınıf_adı ve nesne_adı) {. // kopya yapıcısının gövdesi. } // object_name, başlatmanın sağ tarafındaki nesneyi ifade eder. 

Programcı bir C ++ programında kopya kurucu yaratmazsa, derleyici dolaylı olarak bir kopya kurucu sağlar. Derleyici tarafından sağlanan örtük bir kopya kurucu, kaynak nesnenin üye-bilgili kopyasını yapar. Ancak, bazen üye-bilgili kopya yeterli değildir, çünkü nesne bir işaretçi değişkeni içerebilir. Bir işaretçi değişkenini kopyalamak, işaretçi değişkeninde depolanan adresi kopyalamak anlamına gelir, ancak işaretçi değişkeninde depolanan adresi kopyalamak istemeyiz, bunun yerine işaretçinin işaret ettiği noktayı kopyalamak istiyoruz. Dolayısıyla, programda bu tür sorunları çözmek için açık bir “kopya kurucu” ya ihtiyaç vardır.

Bir kopya kurucu aşağıdaki şekilde üç durumda çağrılır:

  • Kopya yapıcısı, yeni bir nesne mevcut olanla başlatıldığında çağırır.
  • Nesne, referans olmayan bir parametre olarak bir işleve geçti.
  • Nesne işlevden döndürülür.

Örnek olarak kopya kurucuyu anlayalım.

 sınıf kopyası {int num; public: copy () {} // varsayılan yapıcı kopyası (int a) {// initializing constructor num = a; } copy (copy & c) {// Yapıyı kopyala num = c.num; } void show () {cout << num; }}; int main () {kopya A (200); // Nesne A yaratılmış ve ilklendirilmiş kopya B (A); // Kopya yapıcısını kopyala C = A; // Kopya D adı verilen kopya kurucu; D = A; // copy kurucusu çağrılmadı çünkü nesne D yeni yaratılmamış nesne. // bu bir atama işlemidir. 0 döndür; } 

Yukarıdaki kodda açıkça bir “kopya (kopyala & c)” yapıcısı ilan etmiştim. Bu kopya kurucu, B nesnesi A nesnesi kullanılarak başlatıldığında çağrılır. İkinci kez, C nesnesi A nesnesi kullanılarak başlatıldığında ikinci kez çağrılır. D nesnesi A nesnesi kullanılarak başlatıldığında, kopya kurucusu çağrılmaz çünkü D başlatılırken Zaten var, yeni yaratılmış olanın içinde değil. Bu nedenle, burada atama operatörü çağrılır.

Görevlendirme Operatörünün Tanımı

Atama operatörü, C ++ atanan bir operatördür. “=” Operatörü, atama operatörünü çağırmak için kullanılır. Bir nesnede bulunan verileri aynı şekilde başka bir nesneye kopyalar. Atama operatörü bir nesneyi bir başka üyeye kopyalar. Atama operatörünü aşırı yüklemezseniz, bitsel kopyalamayı gerçekleştirir. Bu nedenle, atama operatörünü aşırı yüklemeniz gerekir.

 sınıf kopyası {int num; public: copy () {} // varsayılan yapıcı kopyası (int a) {// initializing constructor num = a; } void show () {cout << num; }}; int main () {kopya A (200); // Nesne A yaratılmış ve ilklendirilmiş kopya B (300); // Nesne B yaratıldı ve başlatıldı B = A; // atama operatörü C kopyasını çağırdı; C = A; // atama operatörü return 0 çağırdı; } 

Yukarıdaki kodda, nesne A, nesne B'ye atandığında, her iki nesne zaten var olduğu için atama işleci çağrılır. Benzer şekilde, C nesnesi A nesnesiyle başlatıldığında da durum aynıdır.

Bitsel atama yapıldığında, her iki nesne de aynı bellek konumunu paylaşır ve bir nesnede yapılan değişiklikler başka bir nesneye yansıtır.

Kopya Oluşturucu ile Atama Operatörü Arasındaki Temel Farklılıklar

  1. Bir kopya kurucu, bir atama operatörü olarak bitsel bir operatör olan aşırı yüklenmiş bir inşaatçıdır.
  2. Copy yapıcısını kullanarak, zaten var olan bir nesneyle yeni bir nesneyi başlatabilirsiniz. Öte yandan, bir atama işleci, bir nesneyi diğer nesneye, her ikisi de zaten var olana kopyalar.
  3. Her ne zaman yeni bir nesne zaten mevcut bir nesneyle başlatılsa, bir nesne refrence olmayan bir parametre olarak bir işleve iletildiğinde ya da bir nesne bir işlevden döndürüldüğünde, kopya bir yapı oluşturulur. Öte yandan, bir atama operatörü yalnızca bir nesne başka bir nesneye atandığında çağrılır.
  4. Bir nesne kopya kurucu kullanılarak başlatıldığında, başlatılan nesne ve başlatılan nesne farklı bellek konumunu paylaşır. Diğer yandan, bir nesne atama operatörü kullanılarak başlatıldığında, başlatılmış ve başlatılmış nesneler aynı bellek konumunu paylaşır.
  5. Açıkça bir kopya kurucu tanımlamazsanız, derleyici bir tane sağlar. Öte yandan, bir atama operatörüne aşırı yükleme yapmazsanız, bitsel bir kopyalama işlemi gerçekleştirilir.

Sonuç:

Kopya yapıcısı, nesne ham işaretçiler içerdiğinde bir nesneyi diğerine kopyalamak için en iyisidir.

Top