Шилтемелер жана const-тууралык
Өзгөрмөгө экинчи ат бериңиз, ал эми const ниетиңизди коргосун
const кошсоңуз, компилятор текшере турган убада аласыз: "муну окуйм, бирок өзгөртпөйм". Шилтемелер жана const чогуу чоң объекттерди арзан өткөрүүгө, өзүн-өзү документтеген интерфейстерди жазууга жана каталардын бүтүндөй классын продакшенде түнкү 3тө эмес, компиляция учурунда кармоого мүмкүндүк берет.
- lvalue-шилтеме деген эмне жана ал көрсөткүчтөн эмнеси менен айырмаланарын түшүндүрө аласыз,
- параметрлерди
const-шилтеме аркылуу өткөрүп, көчүрмөлөрдөн качып, өзгөртүү тобокелине барбайсыз, const-методдорду жаза аласыз жана алар эмнени кепилдээрин түшүнөсүз,- const-тууралык чоң программаларды эмне үчүн коопсузураак жана түшүнүктүүрөк кыларын талкуулайсыз.
1. Шилтеме деген эмне?
lvalue-шилтеме — бул мурунтан бар объектке шилтеген ат. int& r = x; деп жазганыңызда сиз x тин көчүрмөсүн жасабайсыз жана жаңы объект түзбөйсүз — сиз ошол эле объектке экинчи ат бересиз. Ошол учурдан баштап r жана x — эстутумдагы бир уячанын эки этикеткасы.
Шилтемени эки эреже аныктайт жана аны C++ тин башка ар кандай куралынан айырмалайт:
- Ал сөзсүз инициализацияланышы керек. Инициализацияланбаган шилтеме деген жок.
int& r;компиляцияланбайт — шилтеме жаралган учурунда бир нерсеге байланышы керек. - Аны эч качан кайра байлоого болбойт.
rбир жолуxке шилтесе, ал бүт өмүрү боюxке шилтейт.r = y;деп жазууrдиyге көрсөтпөйт; алyдин маанисинxке көчүрөт.
#include <iostream>
int main() {
int x = 10;
int& r = x; // r - x тин башка аты
r = 20; // r аркылуу жазуу -> x ти өзгөртөт
std::cout << x << '\n'; // 20 басып чыгарат
int y = 99;
r = y; // кайра байлоо ЭМЕС: y дин маанисин x ке көчүрөт
std::cout << x << '\n'; // 99 басып чыгарат
std::cout << &r << " == " << &x << '\n'; // бирдей дарек
}
r жана x бир даректи бөлүшкөндүктөн, &r жана &x алуу бирдей көрсөткүч берет. Шилтеменин байкала турган өз алдынча эстутуму жок — ал чындыгында башка ат астындагы ошол эле объект.