Sobes.tech
Middle

C++ da std::string turidagi ob'ektni ko'chirishda nima bo'ladi?

sobes.tech AI

AIdan javob

std::string ni ko'chirilganda, resurs (xotira) mulkiyati asl obyektdan maqsadli obyekga o'tkaziladi. Matnning mazmunini (belgilarni) ko'chirish o'rniga, faqat buferga ishora qiluvchi ko'rsatkich, uning o'lchami va sig'imi ko'chiriladi. Asl obyektda valid, ammo noma'lum holat yuzaga keladi (odatda, ko'rsatkich nullga aylantiriladi, va o'lcham ham sig'im ham nolga tenglashtiriladi), bu esa ikki marta xotira bo'shatishni oldini oladi. Bu to'liq ko'chirishdan ancha tezroq, ayniqsa uzun matnlar uchun.

#include <string>
#include <iostream>
#include <utility>

int main() {
    std::string original = "Juda uzun matn, uni ko'chirmoqchi emasligingiz";
    std::cout << "Asl (oldin ko'chirishdan): " << original << std::endl;

    // originalni moved ga o'tkazamiz
    std::string moved = std::move(original);

    std::cout << "O'tkazildi (keyin ko'chirish): " << moved << std::endl;
    // original endi valid, ammo noma'lum holatda.
    // Ko'chirishdan keyin originalni ishlatish noma'lum xatti-harakat.
    // Biroq, ko'plab implementatsiyalar uni bo'sh holatga qaytaradi.
    // std::cout << "Asl (ko'chirishdan keyin): " << original << std::endl; // Xatarli!

    return 0;
}

Ko'chirish konstruktor yoki tayinlash operatori:

  • Maqsadli obyektdagi buferga ko'rsatkichni tayinlaydi.
  • Maqsadli obyektdagi o'lcham va sig'imni tayinlaydi.
  • Manba obyektdagi bufer ko'rsatkichini nullptr ga o'rnatadi.
  • Manba obyektdagi o'lcham va sig'imni 0 ga o'rnatadi.

Bu, ko'chirish semantikasi (rvalue-yo'nalishlar va maxsus konstruktorlar/operatorlar) yordamida amalga oshiriladi.