Мазмунга өтүү

Көчүрмө семантикасы жана бештик эрежеси

Сабактын башталышы

Көчүрмө семантикасы жана бештик эрежеси

Ресурска ээлик кылган өз типтериңиз үчүн көчүрүү, ыйгаруу жана жок кылуу эмнени билдирерин чечүү

Негизги идея: Ар бир C++ классы кантип көчүрүлүшүн, ыйгарылышын жана жок кылынышын мурдатан билет - бул операцияларды сиз үчүн компилятор жазат. Бул демейки жүрүм маани-мүчөлөрдөн турган класстар үчүн эң сонун, бирок чийки ресурска (үймөктөгү эстутум, файл дескриптору, сокет) ээлик кылган класс үчүн кооптуу. Демейки көчүрмө көрсөткүчтү эмес, ал көрсөткөн нерсени кайталайт, ошондуктан эки объект бир ресурска ээ болуп, аны эки жолу бошотот. Бештик эрежеси бул операцияларды качан жана кантип өз колуңузга алууну айтып берет.
Аягында сиз төмөнкүлөрдү жасай аласыз:
  • компилятор жараткан атайын мүчө-функцияларды атап, ар биринин демейде эмне кыларын айтуу,
  • тайыз жана терең көчүрмөнүн айырмасын жана ээлик кылган класстын тайыз көчүрмөсү эмне үчүн кош бошотууга алып келерин түшүндүрүү,
  • туура көчүрмө конструкторун жана көчүрмө ыйгаруу операторун жазуу (copy-and-swap идиомасын кошуп),
  • үчтүк, бештик жана нөлдүк эрежесин колдонуу жана кайсы операциялар бар экенин башкаруу үчүн =default жана =delete пайдалануу.

Бул тема сиз чийки көрсөткүчтөрдү, new/delete жана RAII-ди билесиз деп эсептейт. Бул Жылдыруу семантикасына киришүү темасы билинбей таянган жетишпеген звено: жылдыруу операциялары сиз көчүрмө операцияларын түшүнгөндөн кийин гана маани алат.

1. Атайын мүчө-функциялар

Эгер сиз жазбасаңыз, компилятор сиз үчүн жаратып берген аз сандагы мүчө-функциялар бар. Аларды атайын мүчө-функциялар деп аташат. Көчүрмө семантикасы үчүн адегенде алардын үчөө маанилүү:

  • Деструктор ~T() - объект жок болгондо аткарылат; анын милдети - объект ээлик кылган нерсени бошотуу.
  • Көчүрмө конструктору T(const T&) - бар объекттин көчүрмөсү катары таптакыр жаңы объект курат (T b = a; же T b(a);).
  • Көчүрмө ыйгаруу оператору T& operator=(const T&) - мурдатан курулган объекттин мазмунун башка объекттин көчүрмөсү менен алмаштырат (b = a;).

Заманбап C++то аларга дагы экөө кошулат (мурдагы темада көргөн жылдыруу операциялары): жылдыруу конструктору T(T&&) жана жылдыруу ыйгаруу оператору T& operator=(T&&). Бул бешөө чогуу бештик эрежесинин темасы.

Компилятор жараткан көчүрмө операциялары мүчө боюнча көчүрмө жасайт: ар бир мүчөнү ал өзүн көчүргөндөй көчүрөт. int үчүн бул маанини көчүрөт; чийки көрсөткүч үчүн бул дарек көчүрөт, ал көрсөткөн эстутумду эмес. Дал ушул факт - бул темадагы бардык каталардын тамыры.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө