Topshiriq operatori (C ++) - Assignment operator (C++)

In C ++ dasturlash tili, tayinlash operatori, =, bo'ladi operator uchun ishlatilgan topshiriq. Boshqa C ++ operatorlari singari, bo'lishi mumkin haddan tashqari yuklangan.

The nusxa tayinlash operatori, ko'pincha "tayinlash operatori" deb nomlangan, manba (o'ng tomon) va manzil (chap tomon) bir xil sinf turiga ega bo'lgan tayinlash operatorining maxsus holati. Bu biri maxsus a'zo funktsiyalari, demak, dasturchi uni e'lon qilmasa, uning standart versiyasi kompilyator tomonidan avtomatik ravishda yaratiladi. Odatiy versiya a'zolik yo'nalishi bo'yicha nusxa ko'chirishni amalga oshiradi, bu erda har bir a'zo o'z nusxasini tayinlash operatori tomonidan nusxa ko'chiriladi (shuningdek, dasturchi tomonidan e'lon qilinishi yoki kompilyator tomonidan yaratilishi mumkin).

Nusxa tayinlash operatori nusxa ko'chirish konstruktori u topshiriq maqsadidagi ma'lumotlar a'zolarini tozalashi kerak (va o'z-o'zini belgilashni to'g'ri bajarishi kerak), nusxa ko'chirish konstruktori boshlanmagan ma'lumotlar a'zolariga qiymatlarni beradi.[1] Masalan:

My_Array birinchi;           // sukut bo'yicha konstruktor bo'yicha initsializatsiyaMy_Array ikkinchi(birinchi);   // nusxa ko'chirish konstruktori bilan boshlashMy_Array uchinchi = birinchi;   // Shuningdek, nusxa ko'chirish konstruktori tomonidan ishga tushirishikkinchi = uchinchi;           // nusxa ko'chirish operatori tomonidan tayinlash

Haddan tashqari yuklangan operatorni qaytarish qiymati

Til haddan tashqari yuklangan tayinlash operatoriga o'zboshimchalik bilan qaytish turiga ega bo'lishiga ruxsat beradi (shu jumladan bekor). Biroq, operator odatda merosxo'rga havolani qaytarish uchun aniqlanadi. Bu o'rnatilgan turlar uchun tayinlash operatorining xatti-harakatlariga mos keladi (tayinlangan qiymatni qaytarish ) va operator chaqiruvini ifoda sifatida ishlatishga imkon beradi, masalan, boshqaruv bayonotlarida yoki zanjirli topshiriq. Shuningdek, C ++ standart kutubxonasi foydalanuvchi tomonidan taqdim etilgan ba'zi turlari uchun ushbu xatti-harakatni talab qiladi.[2]

Nusxa tayinlash operatorini ortiqcha yuklash

Qachon chuqur nusxalar ob'ektlarni yaratish kerak, istisno xavfsizligi hisobga olinishi kerak. Resurslarni taqsimlash hech qachon muvaffaqiyatsiz tugaganda, bunga erishishning bir usuli:

  1. Yangi manbalarni sotib oling
  2. Eski manbalarni bo'shating
  3. Ob'ektga yangi resurslarning tutqichlarini tayinlang
sinf My_Array{    int* qator;    int hisoblash;jamoat:    My_Array& operator=(konst My_Array& boshqa)    {        agar (bu != &boshqa) { // yaroqsiz o'z-o'zini tayinlashdan himoya qilish            // 1: yangi xotira ajratish va elementlarni nusxalash            int* yangi_array = yangi int[boshqa.hisoblash];            std::nusxa ko'chirish(boshqa.qator, boshqa.qator + boshqa.hisoblash, yangi_array);            // 2: eski xotirani ajratish            o'chirish[] qator;            // 3: ob'ektga yangi xotirani tayinlash            qator = yangi_array;            hisoblash = boshqa.hisoblash;        }        // shartnoma bo'yicha har doim * buni qaytaring        qaytish *bu;    }    // ...};

Ammo, agar muvaffaqiyatsiz bo'lsa (tashlamaslik ) almashtirish funktsiyasi barcha a'zo sub'ektlar uchun mavjud va sinf a ni taqdim etadi nusxa ko'chirish konstruktori va halokatchi (buni shunga mos ravishda bajarishi kerak uchta qoidalar ), nusxa ko'chirishni tayinlashning eng to'g'ri usuli quyidagicha:[3]

jamoat:    bekor almashtirish(My_Array & boshqa) // almashtirish a'zosi funktsiyasi (hech qachon ishlamasligi kerak!)    {        // barcha a'zolarni (va agar kerak bo'lsa asosiy subobjectni) boshqalari bilan almashtirish        foydalanish std::almashtirish; // ADL tufayli kompilyator foydalanadi         // agar mavjud bo'lsa, a'zolar uchun maxsus almashtirish        // std :: swap-ga qaytish        almashtirish(qator, boshqa.qator);        almashtirish(hisoblash, boshqa.hisoblash);    }    My_Array & operator = (My_Array boshqa) // eslatma: argument qiymat bo'yicha o'tkazildi!    {        // buni boshqasi bilan almashtirish        almashtirish(boshqa);        // shartnoma bo'yicha har doim * buni qaytaring        qaytish *bu;        // boshqasi yo'q qilinadi, xotirani bo'shatadi    }

Turli sinflar orasidagi topshiriq

C ++ turli sinflar o'rtasida tayinlashni qo'llab-quvvatlaydi, ikkalasi ham yashirin nusxa ko'chirish konstruktori va tayinlash operatori, agar maqsad namunasi klassi manba nusxasi sinfining ajdodi bo'lsa:

sinf Ajdod {jamoat:    int a;};sinf Avlod : jamoat Ajdod {jamoat:    int b;};int asosiy(){    Avlod d;    Ajdod a(d);    Ajdod b(d);    a = d;}

Avlodlarning maydonlarini boshlanmasdan qoldirishi mumkin bo'lgan ajdodlardan avlodlarga nusxalashga yo'l qo'yilmaydi.

Shuningdek qarang

Adabiyotlar

  1. ^ Stroustrup, Bjarne (2000). C ++ dasturlash tili (3 nashr). Addison-Uesli. p. 244. ISBN  978-0-201-70073-2.
  2. ^ Ishchi loyiha, C ++ dasturlash tili uchun standart, 17.6.3.1-bo'lim, 23-jadval; http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
  3. ^ Satter, H.; Aleksandresku, A. (2004 yil oktyabr), C ++ kodlash standartlari, Addison-Uesli, ISBN  0-321-11358-6

Tashqi havolalar