Көчүрмө семантикасы жана бештик эрежеси
Ресурска ээлик кылган өз типтериңиз үчүн көчүрүү, ыйгаруу жана жок кылуу эмнени билдирерин чечүү
- компилятор жараткан атайын мүчө-функцияларды атап, ар биринин демейде эмне кыларын айтуу,
- тайыз жана терең көчүрмөнүн айырмасын жана ээлик кылган класстын тайыз көчүрмөсү эмне үчүн кош бошотууга алып келерин түшүндүрүү,
- туура көчүрмө конструкторун жана көчүрмө ыйгаруу операторун жазуу (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 үчүн бул маанини көчүрөт; чийки көрсөткүч үчүн бул дарек көчүрөт, ал көрсөткөн эстутумду эмес. Дал ушул факт - бул темадагы бардык каталардын тамыры.