Middle
C++ да std::string түрүндөгү объектти которууда эмне болот?
sobes.tech AI
AIден жооп
std::string-ти көчүргөндө, ресурстун (жадвалдын) менчиги келип чыгыш объекттен максаттуу объектке өткөрүлүп берилет. Жолдун мазмунун (символдорду) көчүрүү ордуна, гана буферге ишара кылган көрсөткүч, анын өлчөмү жана сыйымдуулугу көчүрүлөт. Баштапкы объект жарактуу, бирок анык эмес абалда калат (адатта, көрсөткүч нулга айланат, жана өлчөмү жана сыйымдуулугу нөлгө коюлат), бул экинчи жолу эс тутумду бошотууну алдын алат. Бул толук көчүрүүдөн кыйла тезирээк, айрыкча узун саптар үчүн.
#include <string>
#include <iostream>
#include <utility>
int main() {
std::string original = "Өте узун сап, аны көчүргүңүз келбейт";
std::cout << "Баштапкы (көчүрүүдөн мурун): " << original << std::endl;
// original-ды movedке которобуз
std::string moved = std::move(original);
std::cout << "Көчүрүлгөн (көчүрүүдөн кийин): " << moved << std::endl;
// original эми жарактуу, бирок анык эмес абалда.
// Көчүрүүдөн кийин original-ды колдонуу анык эмес жүрүм-турум.
// Бирок, көптөгөн ишке ашыруулар аны бош абалга келтирет.
// std::cout << "Баштапкы (көчүрүүдөн кийин): " << original << std::endl; // Коркунучтуу!
return 0;
}
Көчүрүү курулмасы же белгилүү оператор:
- Мақсаттуу объектке буфердин көрсөткүчүн белгилейт.
- Мақсаттуу объектке өлчөм жана сыйымдуулук белгилейт.
- Баштапкы объекттин буфер көрсөткүчүн
nullptrкылат. - Баштапкы объекттин өлчөмү жана сыйымдуулугу 0 кылынат.
Бул, көчүрүү семантикасы (rvalue- шилтемелер жана атайын курулмалар/операторлор) аркылуу ишке ашырылат.