Const (computer programming)
சில நிரலாக்க மொழிகளில், கான்ஸ்ட் என்பது ஒரு வகை தகுதி (தரவு வகைக்கு பயன்படுத்தப்படும் ஒரு முக்கிய சொல்) ஆகும், இது தரவு படிக்க மட்டுமே என்பதைக் குறிக்கிறது. மாறிலிகளை அறிவிக்க இதைப் பயன்படுத்தலாம் என்றாலும், மொழிகளின் சி குடும்பத்தில் வகையின் ஒரு பகுதியாக இருப்பதில் மற்ற மொழிகளில் உள்ள ஒத்த கட்டமைப்புகளிலிருந்து வேறுபடுகிறது, இதனால் சுட்டிகள், குறிப்புகள், கலப்பு தரவு வகைகள் மற்றும் வகை சரிபார்ப்பு ஆகியவற்றுடன் இணைக்கும்போது சிக்கலான நடத்தை உள்ளது. மற்ற மொழிகளில், தரவு ஒரு நினைவக இருப்பிடத்தில் இல்லை, ஆனால் ஒவ்வொரு பயன்பாட்டிலும் தொகுக்கும் நேரத்தில் நகலெடுக்கப்படுகிறது. இதைப் பயன்படுத்தும் மொழிகளில் சி, சி + +, டி, ஜாவாஸ்கிரிப்ட், ஜூலியா மற்றும் ரஸ்ட் ஆகியவை அடங்கும். ஒரு பொருள் அறிவிப்பில் பயன்படுத்தப்படும்போது, அது பொருள் ஒரு மாறிலி என்பதைக் குறிக்கிறதுஃ அதன் மதிப்பு ஒரு மாறியைப் போலல்லாமல் மாற்றப்படாமல் போகலாம். இந்த அடிப்படை பயன்பாடு-மாறிலிகளை அறிவிக்க-பல மொழிகளில் இணைகளைக் கொண்டுள்ளது. இருப்பினும், மற்ற மொழிகளைப் போலல்லாமல், சி குடும்ப மொழிகளில் கான்ஸ்ட் என்பது வகையின் ஒரு பகுதியாகும், பொருளின் ஒரு பகுதி அல்ல. எடுத்துக்காட்டாக, C இல், ஒரு பொருள் x ஐ int கான்ஸ்ட் வகையாக அறிவிக்கிறது-கான்ஸ்ட் என்பது வகையின் ஒரு பகுதியாகும், இது "(int கான்ஸ்ட்) x" ஐப் பகுப்பாய்வு செய்வது போல-அடாவில், ஒரு மாறிலி (ஒரு வகையான பொருள்) X ஐ இன்டெஜர் வகையாக அறிவிக்கிறதுஃ மாறிலி என்பது பொருளின் ஒரு பகுதியாகும், ஆனால் வகையின் ஒரு பகுதி அல்ல. இது இரண்டு நுட்பமான முடிவுகளைக் கொண்டுள்ளது. முதலாவதாக, கான்ஸ்ட்டை மிகவும் சிக்கலான வகையின் பகுதிகளுக்கு பயன்படுத்தலாம்-எடுத்துக்காட்டாக, இன்ட் கான்ஸ்ட் * கான்ஸ்ட் x; ஒரு நிலையான முழு எண்ணுக்கு ஒரு நிலையான சுட்டியை அறிவிக்கிறது, அதே நேரத்தில் இன்ட் கான்ஸ்ட் * x; ஒரு மாறுபட்ட சுட்டியை ஒரு நிலையான முழு எண்ணுக்கு அறிவிக்கிறது, மற்றும் இன்ட் * கான்ஸ்ட் x; ஒரு மாறி முழு எண்ணுக்கு ஒரு நிலையான சுட்டியை அறிவிக்கிறது. இரண்டாவதாக, கான்ஸ்ட் வகையின் ஒரு பகுதியாக இருப்பதால், அது வகைச் சரிபார்ப்பின் ஒரு பகுதியாக பொருந்த வேண்டும். எடுத்துக்காட்டாக, பின்வரும் குறியீடு செல்லுபடியாகாதுஃ வெற்றிடமான f (int & x);//. int மாறிலி i; f (i); ஏனெனில் f க்கான வாதம் ஒரு மாறி முழு எண்ணாக இருக்க வேண்டும், ஆனால் i ஒரு நிலையான முழு எண். இந்த பொருத்தம் நிரல் சரியான ஒரு வடிவமாகும், மேலும் இது கான்ஸ்ட்-சரியானது என்று அழைக்கப்படுகிறது. இது ஒப்பந்தத்தின் மூலம் நிரலாக்கத்தின் ஒரு வடிவத்தை அனுமதிக்கிறது, அங்கு செயல்பாடுகள் அவற்றின் வகை கையொப்பத்தின் ஒரு பகுதியாக அவற்றின் வாதங்களை மாற்றியமைக்கிறதா இல்லையா என்பதையும், அவற்றின் திரும்ப மதிப்பு மாற்றியமைக்கப்படுகிறதா இல்லையா என்பதையும் குறிப்பிடுகின்றன. இந்த வகை சரிபார்ப்பு முதன்மையாக சுட்டிகள் மற்றும் குறிப்புகளில் ஆர்வமாக உள்ளது-முழு எண்கள் போன்ற அடிப்படை மதிப்பு வகைகள் அல்ல-ஆனால் கலப்பு தரவு வகைகள் அல்லது கொள்கலன்கள் போன்ற வார்ப்புரு வகைக்கும். வகை வற்புறுத்தல் (மறைமுக வகை மாற்றம்) மற்றும் சி அழைப்பு-மூலம்-மதிப்பு (சி + + மற்றும் டி அழைப்பு-மூலம்-மதிப்பு அல்லது அழைப்பு-மூலம்-குறிப்பு) காரணமாக கான்ஸ்ட் பெரும்பாலும் தவிர்க்கப்படலாம் என்ற உண்மையால் இது மறைக்கப்படுகிறது. விளைவுகள் கான்ஸ்ட்-நெஸ் என்ற யோசனை கணினி நினைவகத்தில் சேமிக்கப்படுவதால் மாறி எழுத முடியாதது என்பதைக் குறிக்கவில்லை. மாறாக, கான்ஸ்ட்-நெஸ் என்பது ஒரு தொகுப்பு-நேர கட்டமைப்பாகும், இது ஒரு புரோகிராமர் என்ன செய்ய வேண்டும் என்பதைக் குறிக்கிறது, அவர்கள் என்ன செய்ய முடியும் என்பது அவசியமில்லை. இருப்பினும், முன்னரே வரையறுக்கப்பட்ட தரவுகளின் விஷயத்தில் (சரம் கான்ஸ்ட் * சரம் எழுத்துக்கள் போன்றவை), சி கான்ஸ்ட் பெரும்பாலும் எழுத முடியாதது என்பதை நினைவில் கொள்க. நிரல் இயங்கும் போது ஒரு மாறிலி அதன் மதிப்பை மாற்றாது என்றாலும், கான்ஸ்ட் என்று அறிவிக்கப்பட்ட ஒரு பொருள் நிரல் இயங்கும் போது அதன் மதிப்பை உண்மையில் மாற்றக்கூடும். டிஜிட்டல் உள்ளீட்டின் தற்போதைய நிலை போன்ற உட்பொதிக்கப்பட்ட அமைப்புகளுக்குள் படிக்க மட்டுமே பதிவேடுகள் ஒரு பொதுவான எடுத்துக்காட்டு. டிஜிட்டல் உள்ளீடுகளுக்கான தரவு பதிவேடுகள் பெரும்பாலும் நிலையானவை மற்றும் நிலையற்றவை என்று அறிவிக்கப்படுகின்றன. இந்த பதிவேடுகளின் உள்ளடக்கம் நிரல் எதுவும் செய்யாமல் மாறக்கூடும் (நிலையற்றது) ஆனால் நீங்கள் அவர்களுக்கு எழுதக்கூடாது (கான்ஸ்ட்). மற்ற பயன்பாடுகள் கூடுதலாக, ஒரு (நிலையான அல்லாத) உறுப்பினர்-செயல்பாட்டை கான்ஸ்ட் என்று அறிவிக்கலாம். இந்த வழக்கில், அத்தகைய செயல்பாட்டிற்குள் உள்ள இந்த சுட்டிக்காட்டி வெறுமனே பொருள் வகை * வகையை விட பொருள் வகை கான்ஸ்ட் * வகையாகும். இதன் பொருள் என்னவென்றால், இந்த பொருளுக்கான கான்ஸ்ட் அல்லாத செயல்பாடுகளை அத்தகைய செயல்பாட்டிற்குள் இருந்து அழைக்க முடியாது, அல்லது உறுப்பினர் மாறிகளை மாற்ற முடியாது. சி + + இல், ஒரு உறுப்பினர் மாறி மாற்றத்தக்கதாக அறிவிக்கப்படலாம், இது இந்த கட்டுப்பாடு அதற்கு பொருந்தாது என்பதைக் குறிக்கிறது. சில சந்தர்ப்பங்களில், இது பயனுள்ளதாக இருக்கும், எடுத்துக்காட்டாக கேச்சிங், குறிப்பு எண்ணிக்கை மற்றும் தரவு ஒத்திசைவு. இந்த சந்தர்ப்பங்களில், பொருளின் தர்க்கரீதியான பொருள் (நிலை) மாறாமல் இருக்கும், ஆனால் பொருள் அதன் பிட்வைஸ் பிரதிநிதித்துவம் மாறக்கூடும் என்பதால் உடல் ரீதியாக மாறாமல் இருக்காது. சி, சி + + மற்றும் டி ஆகியவற்றில், பயனரால் வரையறுக்கப்பட்டவை உட்பட அனைத்து தரவு வகைகளும் கான்ஸ்ட்டாக அறிவிக்கப்படலாம், மேலும் கான்ஸ்ட்-சரியானது அனைத்து மாறிகள் அல்லது பொருள்களையும் மாற்றியமைக்க வேண்டிய அவசியமில்லை என்றால் அவற்றை அறிவிக்க வேண்டும் என்று கட்டளையிடுகிறது. கான்ஸ்ட்டின் இத்தகைய செயலூக்கமான பயன்பாடு மதிப்புகளை "புரிந்துகொள்ளவும், கண்காணிக்கவும், நியாயப்படுத்தவும் எளிதாக்குகிறது", இதனால் இது குறியீட்டின் வாசிப்பு மற்றும் புரிந்துகொள்ளும் தன்மையை அதிகரிக்கிறது மற்றும் குழுக்களில் வேலை செய்வதையும் குறியீட்டைப் பராமரிப்பதையும் எளிதாக்குகிறது, ஏனெனில் இது ஒரு மதிப்பின் நோக்கம் பற்றிய தகவல்களைத் தெரிவிக்கிறது. குறியீட்டைப் பற்றி நியாயப்படுத்தும்போது இது தொகுப்பாளருக்கும் டெவலப்பருக்கும் உதவும். இது ஒரு உகந்த தொகுப்பானை மிகவும் திறமையான குறியீட்டை உருவாக்கவும் உதவும். எளிய தரவு வகைகள் எளிய சுட்டிக்காட்டி அல்லாத தரவு வகைகளுக்கு, கான்ஸ்ட் தகுதியைப் பயன்படுத்துவது நேரடியானது. வரலாற்று காரணங்களுக்காக இது சில வகைகளின் இருபுறமும் செல்லலாம் (எடுத்துக்காட்டாக, கான்ஸ்ட் சார் ஃபூ = 'அ'; இது சார் கான்ஸ்ட் ஃபூ = 'அ'; க்கு சமம்). சில செயல்பாடுகளில், கான்ஸ்ட்டை இரண்டு முறை பயன்படுத்துவது (எடுத்துக்காட்டாக, கான்ஸ்ட் சார் கான்ஸ்ட் அல்லது சார் கான்ஸ்ட் கான்ஸ்ட்) ஒரு எச்சரிக்கையை உருவாக்குகிறது, ஆனால் பிழை அல்ல. சுட்டிக்காட்டி மற்றும் குறிப்புகள் சுட்டிக்காட்டி மற்றும் குறிப்பு வகைகளுக்கு, கான்ஸ்ட்டின் பொருள் மிகவும் சிக்கலானது-சுட்டிக்காட்டி அல்லது சுட்டிக்காட்டப்படும் மதிப்பு அல்லது இரண்டும் கான்ஸ்ட்டாக இருக்கலாம். மேலும், தொடரியல் குழப்பமாக இருக்கலாம். ஒரு சுட்டிக்காட்டி எழுதக்கூடிய மதிப்புக்கு ஒரு கான்ஸ்ட் சுட்டிக்காட்டி அல்லது ஒரு கான்ஸ்ட் மதிப்புக்கு எழுதக்கூடிய சுட்டிக்காட்டி அல்லது கான்ஸ்ட் மதிப்புக்கு கான்ஸ்ட் சுட்டிக்காட்டி என அறிவிக்கப்படலாம். ஒரு கான்ஸ்ட் சுட்டிக்காட்டியை அது ஆரம்பத்தில் ஒதுக்கப்பட்டதிலிருந்து வேறுபட்ட பொருளை சுட்டிக்காட்ட மறுசீரமைக்க முடியாது, ஆனால் அது சுட்டிக்காட்டும் மதிப்பை மாற்ற பயன்படுத்தப்படலாம் (சுட்டிக்காட்டி என்று அழைக்கப்படுகிறது). சி + + இல் உள்ள குறிப்பு மாறிகள் கான்ஸ்ட் சுட்டிகளுக்கான மாற்று தொடரியல் ஆகும். மறுபுறம், ஒரு கான்ஸ்ட் பொருளுக்கு ஒரு சுட்டிக்காட்டி மற்றொரு நினைவக இருப்பிடத்தை சுட்டிக்காட்ட மறுசீரமைக்கப்படலாம் (இது அதே வகை அல்லது மாற்றக்கூடிய வகையின் பொருளாக இருக்க வேண்டும்), ஆனால் அது சுட்டிக்காட்டும் நினைவகத்தை மாற்ற பயன்படுத்த முடியாது. ஒரு கான்ஸ்ட் பொருளுக்கு ஒரு கான்ஸ்ட் சுட்டிக்காட்டி அறிவிக்கப்படலாம் மற்றும் அப்போயின்டியை மாற்றுவதற்கோ அல்லது மற்றொரு பொருளை சுட்டிக்காட்டுவதற்கு மீண்டும் ஒதுக்குவதற்கோ பயன்படுத்த முடியாது. பின்வரும் குறியீடு இந்த நுணுக்கங்களை விளக்குகிறதுஃ வெற்றிடமான ஃபூ (int * ptr, int மாறிலி * ptrToConst, int * மாறிலி மாறிலி மாறிலி மாறிலி) {* ptr = 0;// OK: தரவுகளுக்கு சுட்டிக்காட்டப்பட்ட ptr = null ஐ மாற்றியமைக்கிறது;// சரிஃ சுட்டிக்காட்டி * ptrToConst = 0 ஐ மாற்றியமைக்கிறது;// பிழை! சுட்டிக்காட்டப்பட்ட தரவை மாற்ற முடியாது pttrToConst = null;// OK: சுட்டிக்காட்டியை மாற்றியமைக்கிறது * கான்ஸ்ட்பிடர் = 0;// OK: சுட்டிக்காட்டப்பட்ட தரவை மாற்றியமைக்கிறது கான்ஸ்ட்பிடர் = நல்;// பிழை! சுட்டியை மாற்றியமைக்க முடியவில்லை * costPrToConst = 0;// பிழை! சுட்டிக்காட்டப்பட்ட தரவை மாற்றியமைக்க முடியவில்லை, கான்ஸ்ட்பிடர்டு டூ கான்ஸ்ட் = என். யு. எல். எல்.;// பிழை! சுட்டிக்காட்டி சி மரபுகளை மாற்ற முடியாது அறிவிப்புகளுக்கான வழக்கமான சி மரபுகளைத் தொடர்ந்து, அறிவிப்பு பயன்பாட்டைப் பின்பற்றுகிறது, மேலும் சுட்டிக்காட்டியில் உள்ள * சுட்டிக்காட்டியில் எழுதப்பட்டுள்ளது, இது குறிப்பைக் குறிக்கிறது. எடுத்துக்காட்டாக, int * ptr அறிவிப்பில், குறிப்பிடப்படாத படிவம் * ptr ஒரு int ஆகும், அதே நேரத்தில் குறிப்பு படிவம் ptr ஒரு int க்கு சுட்டிக்காட்டியாகும். இவ்வாறு கான்ஸ்ட் அதன் வலதுபுறத்தில் பெயரை மாற்றியமைக்கிறது. சி + + மரபு அதற்கு பதிலாக * ஐ இன்ட் * பிடிஆர் இல் உள்ளதைப் போல வகையுடன் தொடர்புபடுத்துவதாகும், மேலும் இடதுபுறத்தில் உள்ள வகையை மாற்றியமைப்பதாக கான்ஸ்ட்டைப் படிக்கவும். இன்ட் கான்ஸ்ட் * பிடிஆர் டூ கான்ஸ்ட்டை இவ்வாறு படிக்கலாம் "* பிடிஆர் டூ கான்ஸ்ட் ஒரு இன்ட் கான்ஸ்ட்" (மதிப்பு மாறிலி), அல்லது "பிடிஆர் டூ கான்ஸ்ட் ஒரு இன்ட் கான்ஸ்ட் *" (சுட்டிக்காட்டி ஒரு நிலையான முழு எண்ணுக்கு ஒரு சுட்டிக்காட்டி). எனவேஃ int * ptr;// * ptr என்பது ஒரு int மதிப்பு int கான்ஸ்ட் * ptrToConst;// ptrToConst என்பது ஒரு மாறிலி (int: முழு மதிப்பு) int * கான்ஸ்ட் கான்ஸ்ட்;// கான்ஸ்ட் பி. டி. ஆர் என்பது ஒரு மாறிலி (int *: முழு எண் சுட்டிக்காட்டி) int கான்ஸ்ட் * கான்ஸ்ட் கான்ஸ்ட் பி. டி. ஆர். டூ கான்ஸ்ட்;// கான்ஸ்ட் பி. டி. ஆர். டூ கான்ஸ்ட் என்பது ஒரு நிலையான சுட்டிக்காட்டி மற்றும் புள்ளிகள்// ஒரு நிலையான மதிப்பு சி + + மரபுக்கு சி + + ஐ பகுப்பாய்வு செய்வதற்கான மரபுகளைத் தொடர்ந்து, மதிப்பு அல்ல, வலதுபுறத்திலிருந்து இடதுபுறம் அறிவிப்பைப் படிப்பதே கட்டைவிரல் விதி. எனவே, நட்சத்திரத்தின் இடதுபுறத்தில் உள்ள அனைத்தையும் சுட்டிக்காட்டப்பட்ட வகையாக அடையாளம் காணலாம் மற்றும் நட்சத்திரத்தின் வலதுபுறத்தில் உள்ள அனைத்தும் சுட்டிக்காட்டி பண்புகளாகும். எடுத்துக்காட்டாக, மேலே உள்ள எங்கள் எடுத்துக்காட்டில், இன்ட் கான்ஸ்ட் * ஐ எழுத முடியாத முழு எண்ணைக் குறிக்கும் எழுதக்கூடிய சுட்டியாகப் படிக்கலாம், மேலும் இன்ட் * கான்ஸ்ட்டை எழுத முடியாத சுட்டியாகப் படிக்கலாம், இது எழுதக்கூடிய முழு எண்ணைக் குறிக்கிறது. சிக்கலான அறிவிப்புகள் மற்றும் வரையறைகளைப் புரிந்துகொள்ள உதவும் மிகவும் பொதுவான விதி இதுபோன்று செயல்படுகிறதுஃ நீங்கள் புரிந்துகொள்ள விரும்பும் அடையாளங்காட்டியை வலதுபுறம் முடிந்தவரை படிக்கவும் (அதாவது, அறிவிப்பின் இறுதி வரை அல்லது அடுத்த இறுதி அடைப்புக்குறிக்கு, எது முதலில் வந்தாலும்) நீங்கள் தொடங்கிய இடத்திற்கு பின்னோக்கி படிக்கவும் (அதாவது, அறிவிப்பின் தொடக்கம் வரை அல்லது முந்தைய கட்டத்தில் காணப்படும் இறுதி அடைப்புக்குறிக்கு பொருந்தக்கூடிய திறந்த அடைப்புக்குறிக்கு) நீங்கள் செய்த அறிவிப்பின் தொடக்கத்தை அடைந்ததும். இல்லையென்றால், கடைசியாக பொருந்திய இறுதி அடைப்புக்குறிக்கு அப்பால், படி 2 இல் தொடரவும். இங்கே ஒரு எடுத்துக்காட்டுஃ இடதுபுறம் படிக்கும்போது, நீங்கள் வலதுபுறத்தில் இருந்து இடதுபுறம் கூறுகளைப் படிப்பது முக்கியம். எனவே ஒரு இன்ட் கான்ஸ்ட் * ஒரு கான்ஸ்ட் இன்டுக்கு ஒரு சுட்டிக்காட்டியாக மாறும், ஒரு இன்டுக்கு ஒரு கான்ஸ்ட் சுட்டிக்காட்டியாக அல்ல. சில சந்தர்ப்பங்களில் சி/சி + + கான்ஸ்ட் முக்கிய வார்த்தையை வகையின் இடதுபுறத்தில் வைக்க அனுமதிக்கிறது. C/C + + அத்தகைய வரையறைகளை அனுமதித்தாலும் (இது வரையறைகளை இடமிருந்து வலமாக படிக்கும்போது ஆங்கில மொழியுடன் நெருக்கமாக பொருந்துகிறது), தொகுப்பாளர் இன்னும் மேற்கூறிய நடைமுறையின்படி வரையறைகளைப் படிக்கிறார்ஃ வலமிருந்து இடமாக. ஆனால் நிலையானதாக இருக்க வேண்டியதற்கு முன் கான்ஸ்ட்டை வைப்பது நீங்கள் எழுத விரும்புவதற்கும் நீங்கள் எழுதுவதை தொகுப்பாளர் தீர்மானிப்பதற்கும் இடையிலான பொருந்தாத தன்மையை விரைவாக அறிமுகப்படுத்துகிறது. சுட்டிகளுக்கான சுட்டிகளைக் கவனியுங்கள்ஃ int * * ptr;// ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு சுட்டிக்கு ஒரு புள்ளி சுட்டிக்காட்டி சின்னத்தை வகையுடன் இணைப்பது தந்திரமானது, ஏனெனில் இது ஒரு சுட்டிக்காட்டி வகையை வலுவாக பரிந்துரைக்கிறது, இது அப்படி இல்லை. இங்கே சில எடுத்துக்காட்டுகள் உள்ளனஃ int * a;/* எழுதுங்கள்ஃ */int * a;// a என்பது ஒரு int * a, b க்கு ஒரு சுட்டிக்காட்டி;// CONFUSSING/* எழுதுங்கள்ஃ */int * a, b;// a என்பது ஒரு int க்கு ஒரு சுட்டிக்காட்டி,// ஆனால் b என்பது வெறும் int * a, * b;// UGLY: a மற்றும் b இரண்டும் ints/* எழுதுவதற்கான சுட்டிகள்ஃ */int * a, * b; இந்த சிக்கலைத் தவிர்ப்பதற்காக C + + நடைமுறையைப் பயன்படுத்தினால் ஒரு வரிக்கு ஒரு மாறியை மட்டுமே அறிவிக்க பிஜார்ன் ஸ்ட்ரூஸ்ட்ரப்பின் FAQ பரிந்துரைக்கிறது. குறிப்புகள் மற்றும் மதிப்பு குறிப்புகளை வரையறுப்பதற்கும் இதே கருத்துக்கள் பொருந்தும்ஃ இன்ட்வர் = 22; இன்டென்ஸ்ட் & ரெஃப்டோ கான்ஸ்ட் = வர்;// ஓகே இன்டென்ஸ்ட் & ரெஃப்2 = வர், ரெஃப்3 = வர்;// கான்ஃபியூசிங்ஃ// ரெஃப்2 என்பது ஒரு குறிப்பு, ஆனால் ரெஃப்3 அல்லஃ// ரெஃப்3 என்பது// வர் இன் மதிப்பு இன்ட்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்டென்ஸ்ட //சி + +: int & & rref = int (5), மதிப்பு = 10;// இணைத்தல்ஃ// rref என்பது ஒரு மதிப்பு குறிப்பு, ஆனால் மதிப்பு// வெறும் int ஆகும். / * எழுதுங்கள்ஃ */int & & rref = int (5), மதிப்பு = 10; சுட்டிக்காட்டிகளுக்கு பன்முக வரிசைகள் மற்றும் குறிப்புகள் (அல்லது சுட்டிகள்) பயன்படுத்தும்போது மிகவும் சிக்கலான அறிவிப்புகள் எதிர்கொள்ளப்படுகின்றன. இத்தகைய அறிவிப்புகள் குழப்பமானவை மற்றும் பிழைகள் ஏற்படக்கூடியவை என்றும், எனவே அவை தவிர்க்கப்பட வேண்டும் அல்லது உயர் மட்ட கட்டமைப்புகளால் மாற்றப்பட வேண்டும் என்றும் சில நேரங்களில் வாதிடப்பட்டாலும், இந்த பிரிவின் மேலே விவரிக்கப்பட்டுள்ள செயல்முறை எப்போதும் தெளிவின்மைகள் அல்லது குழப்பங்களை அறிமுகப்படுத்தாமல் பயன்படுத்தப்படலாம். அளவுருக்கள் மற்றும் மாறிகள் கான்ஸ்ட்டை செயல்பாட்டு அளவுருக்கள் மற்றும் மாறிகள் (நிலையான அல்லது தானியங்கி, உலகளாவிய அல்லது உள்ளூர் உட்பட) ஆகிய இரண்டிலும் அறிவிக்க முடியும். பயன்பாடுகளுக்கு இடையே விளக்கம் வேறுபடுகிறது. ஒரு கான்ஸ்ட் நிலையான மாறி (உலகளாவிய மாறி அல்லது நிலையான உள்ளூர் மாறி) ஒரு மாறிலி, மற்றும் இரட்டை கான்ஸ்ட் PI = 3.14159-யதார்த்தமாக நீண்ட, அல்லது ஒட்டுமொத்த தொகுப்பு-நேர அளவுருக்கள் போன்ற கணித மாறிலிகள் போன்ற தரவுகளுக்கு பயன்படுத்தப்படலாம். ஒரு கான்ஸ்ட் தானியங்கி மாறி (நிலையான உள்ளூர் அல்லாத மாறி) என்பது ஒற்றை அசைன்மென்ட் நடக்கிறது என்பதைக் குறிக்கிறது, இருப்பினும் ஒவ்வொரு முறையும் வெவ்வேறு மதிப்பைப் பயன்படுத்தலாம், அதாவது int கான்ஸ்ட் x _ ஸ்கொயர் = x * x. பாஸ்-பை-ரெஃபரென்ஸில் உள்ள ஒரு கான்ஸ்ட் அளவுரு என்பது குறிப்பிடப்பட்ட மதிப்பு மாற்றியமைக்கப்படவில்லை-இது ஒப்பந்தத்தின் ஒரு பகுதியாகும்-அதே நேரத்தில் பாஸ்-பை-வேல்யூவில் உள்ள ஒரு கான்ஸ்ட் அளவுரு (அல்லது சுட்டிக்காட்டி தானே, பாஸ்-பை-ரெஃபரென்ஸில்) இடைமுகத்தில் எதையும் சேர்க்காது (மதிப்பு நகலெடுக்கப்பட்டதால்), ஆனால் உட்புறமாக, செயல்பாடு அளவுருவின் உள்ளூர் நகலை மாற்றாது என்பதைக் குறிக்கிறது (இது ஒரு ஒற்றை பணி). இந்த காரணத்திற்காக, சிலர் பாஸ்-பை-ரெஃபரென்ஸுக்கு மட்டுமே அளவுருக்களில் கான்ஸ்ட்டைப் பயன்படுத்துவதை விரும்புகிறார்கள், அங்கு அது ஒப்பந்தத்தை மாற்றுகிறது, ஆனால் பாஸ்-பை-வேல்யூவுக்கு அல்ல, அங்கு அது செயல்படுத்தலை அம்பலப்படுத்துகிறது. சி + + முறைகள் பயனர் வரையறுக்கப்பட்ட வகைகளுக்கான (கட்டமைப்புகள் மற்றும் வகுப்புகள்) ஒப்பந்த அணுகுமுறையின் மூலம் வடிவமைப்பைப் பயன்படுத்திக் கொள்வதற்காக, அவை முறைகள் மற்றும் உறுப்பினர் தரவைக் கொண்டிருக்கலாம், அவை பொருளின் தரவு உறுப்பினர்களை மாற்றாவிட்டால் புரோகிராமர் இன்ஸ்டன்ஸ் முறைகளை கான்ஸ்டன்ட் என்று குறிக்கலாம். எடுத்துக்காட்டு முறைகளுக்கு கான்ஸ்ட் தகுதியைப் பயன்படுத்துவது கான்ஸ்ட்-சரியான தன்மைக்கு ஒரு அத்தியாவசிய அம்சமாகும், மேலும் இது ஜாவா மற்றும் சி #போன்ற பல பொருள் சார்ந்த மொழிகளில் அல்லது மைக்ரோசாப்டின் சி + +/சி. எல். ஐ அல்லது சி + + க்கான நிர்வகிக்கப்பட்ட நீட்டிப்புகளில் கிடைக்காது. கான்ஸ்ட் முறைகளை கான்ஸ்ட் மற்றும் கான்ஸ்ட் அல்லாத பொருள்களால் ஒரே மாதிரியாக அழைக்க முடியும் என்றாலும், கான்ஸ்ட் அல்லாத முறைகளை கான்ஸ்ட் அல்லாத பொருட்களால் மட்டுமே அழைக்க முடியும். ஒரு இன்ஸ்டன்ஸ் முறையின் கான்ஸ்ட் மாற்றியமைப்பானது "இந்த" சுட்டிக்காட்டி சுட்டிக்காட்டிய பொருளுக்கு பொருந்தும், இது அனைத்து இன்ஸ்டன்ஸ் முறைகளுக்கும் அனுப்பப்படும் ஒரு உள்ளார்ந்த வாதமாகும். எனவே கான்ஸ்ட் முறைகளைக் கொண்டிருப்பது மற்ற வாதங்களைப் போலவே மறைமுகமான "இந்த" சுட்டிக்காட்டி வாதத்திற்கும் கான்ஸ்ட்-சரியான தன்மையைப் பயன்படுத்துவதற்கான ஒரு வழியாகும். இந்த எடுத்துக்காட்டு விளக்குகிறதுஃ வகுப்பு C {int i; பொதுஃ int () கான்ஸ்ட்// குறிப்பு "கான்ஸ்ட்" குறிச்சொல் {ரிட்டர்ன் i;} வெற்றிட செட் (int j)// "கான்ஸ்ட்" இல்லாததைக் கவனியுங்கள்; வெற்றிட ஃபூ (C & nonConstC, C கான்ஸ்ட் & கான்ஸ்ட்சி) {int y = nonConstC.Get ();// Ok int x = constC.Get ();// Ok: Get () என்பது கான்ஸ்ட் nonConstC.Set (10);// Ok: nonConstC என்பது மாற்றியமைக்கப்படக்கூடியது constC.Set (10);// பிழை! செட் () ஒரு கான்ஸ்ட் அல்லாத முறை மற்றும் கான்ஸ்ட்சி ஒரு கான்ஸ்ட்-தகுதி வாய்ந்த பொருள்} மேலே உள்ள குறியீட்டில், செட் () க்கு மறைமுகமான "இந்த" சுட்டிக்காட்டி "சி * கான்ஸ்ட்" வகையைக் கொண்டுள்ளது; அதேசமயம் கெட் () க்கு "இந்த" சுட்டிக்காட்டி "சி கான்ஸ்ட் * கான்ஸ்ட்" வகையைக் கொண்டுள்ளது, இது முறை "இந்த" சுட்டிக்காட்டி மூலம் அதன் பொருளை மாற்ற முடியாது என்பதைக் குறிக்கிறது. பெரும்பாலும் புரோகிராமர் இரு வகையான அழைப்பாளர்களுக்கும் இடமளிக்க ஒரு வகுப்பில் ஒரே பெயரில் (ஆனால் மிகவும் மாறுபட்ட பயன்பாடுகள்) ஒரு கான்ஸ்ட் மற்றும் கான்ஸ்ட் அல்லாத முறை இரண்டையும் வழங்குவார். பின்வருவனவற்றைக் கவனியுங்கள்ஃ வகுப்பு MyArray {int தரவு [100]; பொதுஃ int & Get (int i) {திரும்ப தரவு [i];} int மாறுபாடு & Get (int i) மாறுபாடு {திரும்ப தரவு [i];}}; வெற்றிட ஃபூ (MyArray & வரிசை, MyArray மாறுபாடு & மாறுபாடு) {// ஒரு வரிசை உறுப்புக்கான குறிப்பைப் பெறுங்கள்// மற்றும் அதன் குறிப்பிடப்பட்ட மதிப்பை மாற்றவும். array.Get (5) = 42;// சரி! (அழைப்புகள்ஃ int & MyArray:: Get (int)) constArray.Get (5) = 42;// பிழை! (அழைப்புகள்ஃ int கான்ஸ்ட் & MyArray:: கெட் (int) கான்ஸ்ட்)} அழைப்பு பொருளின் கான்ஸ்ட்-நெஸ் மை அரேயின் எந்த பதிப்பு அழைக்கப்படும் என்பதை தீர்மானிக்கிறதுஃஃ கெட் () இதனால் அழைப்பாளருக்கு ஒரு குறிப்பு கொடுக்கப்படுகிறதா இல்லையா என்பதை அவர் கையாள முடியும் அல்லது பொருளில் உள்ள தனிப்பட்ட தரவை மட்டுமே கவனிக்க முடியும். இரண்டு முறைகளும் தொழில்நுட்ப ரீதியாக வெவ்வேறு கையொப்பங்களைக் கொண்டுள்ளன, ஏனெனில் அவற்றின் "இந்த" சுட்டிகள் வெவ்வேறு வகைகளைக் கொண்டுள்ளன, இது தொகுப்பாளரை சரியான ஒன்றைத் தேர்வுசெய்ய அனுமதிக்கிறது. (ஒரு இண்டிற்கு ஒரு கான்ஸ்ட் குறிப்பைத் திருப்பித் தருவது, இன்ட்டை மதிப்பால் திருப்பித் தருவதற்குப் பதிலாக, இரண்டாவது முறையில் ஓவர் கில் ஆக இருக்கலாம், ஆனால் நிலையான டெம்ப்ளேட் நூலகத்தில் உள்ளதைப் போல தன்னிச்சையான வகைகளுக்கு அதே நுட்பத்தைப் பயன்படுத்தலாம்.) சி மற்றும் சி + + இல் தூய கான்ஸ்ட்-சரியான தன்மைக்கு பல ஓட்டைகள் உள்ளன. அவை முதன்மையாக தற்போதுள்ள குறியீட்டுடன் பொருந்தக்கூடிய வகையில் உள்ளன. முதலாவது, இது சி + + க்கு மட்டுமே பொருந்தும், இது கான்ஸ்ட் காஸ்டின் பயன்பாடாகும், இது புரோகிராமரை கான்ஸ்ட் தகுதியை அகற்ற அனுமதிக்கிறது, இதனால் எந்தவொரு பொருளும் மாற்றியமைக்கப்படலாம். தற்போதுள்ள குறியீடு மற்றும் நூலகங்களைப் பயன்படுத்தும் போது தகுதியை அகற்ற வேண்டிய அவசியம் எழுகிறது, அவை மாற்றியமைக்கப்பட முடியாது, ஆனால் அவை சரியானவை அல்ல. உதாரணமாக, இந்த குறியீட்டைக் கவனியுங்கள்ஃ// ஒரு செயல்பாட்டிற்கான முன்மாதிரி, அதை நாம் மாற்ற முடியாது, ஆனால் நமக்குத் தெரிந்த// அனுப்பப்பட்ட சுட்டியை மாற்றாது. libraryFunc (int * ptr, int அளவு) வெற்றிடமாகும்; CallLibraryFunc (int மாறுபாடு * ptr, int அளவு) (libraryFunc (ptr, அளவு)) வெற்றிடமாகும்;// பிழை! இருப்பினும், ஒரு பொருளை மாற்றுவதற்கான எந்தவொரு முயற்சியும் ஒரு கான்ஸ்ட் காஸ்ட் மூலம் கான்ஸ்ட் என்று அறிவிக்கப்படுவதால், ஐஎஸ்ஓ சி + + தரநிலையின்படி வரையறுக்கப்படாத நடத்தைக்கு வழிவகுக்கிறது. மேலே உள்ள எடுத்துக்காட்டில், பி. டி. ஆர் ஒரு உலகளாவிய, உள்ளூர் அல்லது உறுப்பினர் மாறியை கான்ஸ்ட் என்று அறிவித்தால், அல்லது புதிய இன்ட் கான்ஸ்ட் வழியாக குவியலில் ஒதுக்கப்பட்ட ஒரு பொருளைக் குறிப்பிட்டால், லைப்ரரிஃபங்க் உண்மையில் பி. டி. ஆர் சுட்டிக்காட்டிய மதிப்பை மாற்றாவிட்டால் மட்டுமே குறியீடு சரியானது. ஒரு குறிப்பிட்ட சூழ்நிலை இருப்பதால் சி மொழிக்கு ஒரு ஓட்டை தேவைப்படுகிறது. நிலையான சேமிப்பு காலம் கொண்ட மாறிகள் ஒரு ஆரம்ப மதிப்புடன் வரையறுக்க அனுமதிக்கப்படுகின்றன. இருப்பினும், துவக்குபவர் சரம் மாறிலிகள் மற்றும் பிற எழுத்துக்கள் போன்ற மாறிலிகளை மட்டுமே பயன்படுத்த முடியும், மேலும் மாறி பெயர்கள் போன்ற நிலையான அல்லாத கூறுகளைப் பயன்படுத்த அனுமதிக்கப்படுவதில்லை, துவக்குபவர் கூறுகள் கான்ஸ்ட்டாக அறிவிக்கப்படுகிறதா இல்லையா, அல்லது நிலையான கால மாறி கான்ஸ்ட்டாக அறிவிக்கப்படுகிறதா இல்லையா. நிலையான சேமிப்பு காலத்தைக் கொண்ட ஒரு கான்ஸ்ட் மாறியை துவக்குவதற்கு ஒரு போர்ட்டபிள் அல்லாத வழி உள்ளது. பிற்காலப் பணியின் இடது புறத்தில் ஒரு அச்சுக்கணிப்பை கவனமாக உருவாக்குவதன் மூலம், ஒரு கான்ஸ்ட் மாறியை எழுதலாம், இது கான்ஸ்ட் பண்புக்கூறுகளை திறம்பட அகற்றி, மற்ற கான்ஸ்ட் மாறிகள் போன்ற நிலையான உறுப்புகளுடன் அதை 'துவக்குகிறது'. ஒரு கான்ஸ்ட் மாறிக்குள் எழுதுவது இந்த வழியில் விரும்பியபடி வேலை செய்யலாம், ஆனால் இது வரையறுக்கப்படாத நடத்தையை ஏற்படுத்துகிறது மற்றும் கான்ஸ்ட்-சரியான தன்மையை தீவிரமாக முரண்படுத்துகிறதுஃ அளவு _ டி கான்ஸ்ட் இடையக அளவு = 8 * 1024; அளவு _ டி கான்ஸ்ட் பயனர் டெக்ஸ்ட்பஃபர் அளவு;// ஆரம்ப மதிப்பு கான்ஸ்ட் இடையக அளவைப் பொறுத்தது, இங்கே துவக்க முடியாது. int அமைவு யூசர் டெக்ஸ்ட்பாக்ஸ் (டெக்ஸ்ட்பாக்ஸ் _ டி * இயல்புநிலை டெக்ஸ்ட்பாக்ஸ் வகை, ரெக்ட் _ டி * இயல்புநிலை டெக்ஸ்ட்பாக்ஸ்லோகேஷன்) {* (அளவு _ டி *) & பயனர் டெக்ஸ்ட்பஃபர் அளவு = இடையக அளவு-அளவு (கட்டமைப்பு உரை டெக்ஸ்ட்பாக்ஸ்கண்ட்ரோல்கள்);// எச்சரிக்கைஃ வேலை செய்யலாம், ஆனால் சி உத்தரவாதம் அளிக்கவில்லை குறிப்பாக, உறுப்பினர்களின் சுட்டிகள் மற்றும் குறிப்புகள் அவற்றின் உரிமையாளர்களின் நிலைப்பாட்டைப் பொறுத்தவரை "ஆழமற்றவை" என்று மொழிகள் கட்டளையிடுகின்றன-அதாவது, உறுப்பினர் சுட்டிகள் (மற்றும் நடுவர்கள்) இன்னும் மாற்றத்தக்கவை என்பதைத் தவிர அனைத்து நிலையான உறுப்பினர்களையும் கொண்ட ஒரு பொருள். எடுத்துக்காட்டாக, இந்த சி + + குறியீட்டைக் கவனியுங்கள்ஃ கட்டமைப்பு எஸ் {இன்ட் வால்; இன்ட் * பிடிஆர்;}; வெற்றிட ஃபூ (எஸ் கான்ஸ்ட் & எஸ்) {இன்ட் ஐ = 42; s.val = ஐ;// பிழைஃ எஸ் கான்ஸ்ட், எனவே வால் ஒரு கான்ஸ்ட் இன்ட் s.ptr = & ஐ;// பிழைஃ எஸ் கான்ஸ்ட், எனவே பிடிஆர் என்பது இன்ட் * s.ptr = ஐ க்கு ஒரு கான்ஸ்ட் சுட்டிக்காட்டி;// சரிஃ பிடிஆர் சுட்டிக்காட்டிய தரவு எப்போதும் மாற்றக்கூடியது,// இது சில நேரங்களில் விரும்பத்தக்கதாக இல்லாவிட்டாலும் கூட] பொருள் எஸ் ஃபூ () க்கு அனுப்பப்பட்டாலும், அதன் அனைத்து உறுப்பினர்களையும் நிலையானதாக ஆக்குகிறது, இது அதன் அனைத்து உறுப்பினர்களையும் நிலையானதாக ஆக்குகிறது, s.ptr மூலம் அணுகக்கூடிய சுட்டிக்காட்டி இன்னும் மாற்றியமைக்கப்படுகிறது. இந்த காரணத்திற்காக, உறுப்பினர் சுட்டிகள் மற்றும் குறிப்புகளுக்கான இயல்புநிலை "ஆழமான" கான்ஸ்ட்-நெஸ் ஆக இருக்க வேண்டும் என்று மேயர்ஸ் வாதிடுகிறார், இது கொள்கலனுக்கு சொந்தமாக இல்லாதபோது ஒரு மாற்றத்தக்க தகுதி மூலம் மீறப்படலாம், ஆனால் இந்த மூலோபாயம் ஏற்கனவே உள்ள குறியீட்டுடன் பொருந்தக்கூடிய சிக்கல்களை உருவாக்கும். எனவே, வரலாற்று காரணங்களுக்காக, இந்த ஓட்டை சி மற்றும் சி + + இல் திறந்திருக்கும். ஒரு கான்ஸ்ட்-சரியான இடைமுகத்தின் பின்னால் உள்ள சுட்டியை மறைக்க ஒரு வகுப்பைப் பயன்படுத்துவதன் மூலம் பிந்தைய ஓட்டையை மூட முடியும், ஆனால் அத்தகைய வகுப்புகள் கான்ஸ்ட் பொருளிலிருந்து வழக்கமான நகல் சொற்பொருள்களை ஆதரிக்கவில்லை (கொண்ட வகுப்பை வழக்கமான சொற்பொருள்களால் நகலெடுக்க முடியாது என்பதைக் குறிக்கிறது) அல்லது கவனக்குறைவாக அல்லது வேண்டுமென்றே நகலெடுப்பதன் மூலம் கான்ஸ்ட்-நெஸை அகற்ற அனுமதிப்பதன் மூலம் பிற ஓட்டைகளை அனுமதிக்கிறது. இறுதியாக, சி நிலையான நூலகத்தில் உள்ள பல செயல்பாடுகள் சி 23 க்கு முன் கான்ஸ்ட்-சரியான தன்மையை மீறுகின்றன, ஏனெனில் அவை ஒரு எழுத்து சரத்திற்கு கான்ஸ்ட் சுட்டிக்காட்டியை ஏற்றுக்கொண்டு அதே சரத்தின் ஒரு பகுதிக்கு கான்ஸ்ட் அல்லாத சுட்டிக்காட்டியைத் திருப்புகின்றன. இந்த செயல்பாடுகளில் எஸ்டிஆர்எஸ்ஆர் மற்றும் எஸ்டிஆர்சிஆர் ஆகியவை அடங்கும். சி + + நிலையான நூலகத்தின் சில செயல்பாடுகள், மைக்ரோசாப்ட் சில செயல்பாடுகளின் இரண்டு அதிக சுமை பதிப்புகளை வழங்குவதன் மூலம் இந்த ஓட்டையை மூட முயற்சிக்கிறதுஃ ஒரு "கான்ஸ்ட்" பதிப்பு மற்றும் ஒரு "கான்ஸ்ட் அல்லாத" பதிப்பு. சிக்கல்கள் நிலைத்தன்மையை வெளிப்படுத்த வகை அமைப்பைப் பயன்படுத்துவது பல்வேறு சிக்கல்களுக்கும் சிக்கல்களுக்கும் வழிவகுக்கிறது, அதன்படி விமர்சிக்கப்பட்டு, சி, சி + +, மற்றும் டி. ஜாவா மற்றும் சி #ஆகியவற்றின் குறுகிய சி குடும்பத்திற்கு வெளியே ஏற்றுக்கொள்ளப்படவில்லை, அவை சி மற்றும் சி + + ஆல் பெரிதும் பாதிக்கப்படுகின்றன, இவை இரண்டும் வெளிப்படையாக நிராகரிக்கப்பட்ட கான்ஸ்ட்-ஸ்டைல் வகை தகுதிகள், அதற்கு பதிலாக அடையாளங்காட்டிக்கு பொருந்தக்கூடிய முக்கிய வார்த்தைகளால் நிலைத்தன்மையை வெளிப்படுத்துகின்றன (ஜாவாவில் இறுதி, கான்ஸ்ட் மற்றும் சி #இல் படிக்க மட்டுமே). சி மற்றும் சி + + க்குள் கூட, கான்ஸ்ட்டின் பயன்பாடு கணிசமாக வேறுபடுகிறது, சில திட்டங்கள் மற்றும் நிறுவனங்கள் அதை தொடர்ந்து பயன்படுத்துகின்றன, மற்றவர்கள் அதைத் தவிர்க்கிறார்கள். ஒரு செயல்பாட்டின் தர்க்கம் அதன் உள்ளீடு நிலையானதா இல்லையா என்பதை அறியாமையில் இருக்கும்போது கான்ஸ்ட் வகை தகுதி சிக்கல்களை ஏற்படுத்துகிறது, ஆனால் உள்ளீட்டின் அதே தகுதி வாய்ந்த வகையாக இருக்க வேண்டிய மதிப்பை வழங்குகிறது. வேறு வார்த்தைகளில் கூறுவதானால், இந்த செயல்பாடுகளுக்கு, உள்ளீடு நிலையானதாக இருந்தால் (கான்ஸ்ட்-தகுதி), ரிட்டர்ன் மதிப்பும் இருக்க வேண்டும், ஆனால் உள்ளீடு மாறி இருந்தால் (கான்ஸ்ட்-தகுதி இல்லை), ரிட்டர்ன் மதிப்பும் இருக்க வேண்டும். இந்த செயல்பாடுகளின் வகை கையொப்பம் வேறுபடுவதால், அதற்கு ஒரே தர்க்கத்துடன் இரண்டு செயல்பாடுகள் (அல்லது பல உள்ளீடுகளின் விஷயத்தில் அதற்கு மேற்பட்டவை) தேவைப்படுகின்றன-இது பொதுவான நிரலாக்கத்தின் ஒரு வடிவமாகும். சி நிலையான நூலகத்தில் உள்ள எளிய செயல்பாடுகளுக்கு கூட இந்த சிக்கல் எழுகிறது, குறிப்பாக ஸ்ட்ராச்சர்; இந்த அவதானிப்பு ரிச்சியால் 1980 களின் நடுப்பகுதியில் டாம் பிளமுக்கு வரவு வைக்கப்படுகிறது. Strchr செயல்பாடு ஒரு சரத்தில் ஒரு எழுத்தை அமைக்கிறது; முறைப்படி, இது சரம் s இல் உள்ள c எழுத்தின் முதல் நிகழ்வுக்கு ஒரு சுட்டியைத் திருப்புகிறது, மேலும் கிளாசிக் C (K & R C) இல் அதன் முன்மாதிரிஃ சரம் * ஸ்ட்ராச்சர் (சரம் * கள், இன்ட்சி); ஸ்ட்ராச்சர் செயல்பாடு உள்ளீட்டு சரத்தை மாற்றாது, ஆனால் திரும்பும் மதிப்பு பெரும்பாலும் அழைப்பாளரால் சரத்தை மாற்ற பயன்படுத்தப்படுகிறது, அதாவதுஃ என்றால் (p = ஸ்ட்ராச்சர் (q, '/') * p = '; எனவே ஒருபுறம் உள்ளீட்டு சரம் கான்ஸ்ட்டாக இருக்கலாம் (ஏனெனில் அது செயல்பாட்டால் மாற்றப்படவில்லை), மேலும் உள்ளீட்டு சரம் கான்ஸ்ட்டாக இருந்தால் திரும்பும் மதிப்பும் அப்படியே இருக்க வேண்டும்-மிகவும் வெறுமனே அது சரியாக திரும்பக்கூடும் என்பதால். சி + + இல் இது செயல்பாட்டு ஓவர்லோடிங் மூலம் செய்யப்படுகிறது, பொதுவாக ஒரு டெம்ப்ளேட் வழியாக செயல்படுத்தப்படுகிறது, இதன் விளைவாக இரண்டு செயல்பாடுகள் ஏற்படுகின்றன, இதனால் திரும்பும் மதிப்பு உள்ளீட்டைப் போலவே ஒரே கான்ஸ்ட்-தகுதி வகையைக் கொண்டுள்ளதுஃ சார் * ஸ்ட்ராச்சர் (சார் * எஸ், இன்ட் சி); சார் கான்ஸ்ட் * ஸ்ட்ராச்சர் (சார் கான்ஸ்ட் * எஸ், இன்ட் சி); இவை ஒரு டெம்ப்ளேட் மூலம் வரையறுக்கப்படலாம்ஃ டெம்ப்ளேட் <டி> டி * ஸ்ட்ராச்சர் (டி * எஸ், இன்ட் சி) {. டி இல் இது இன்அவுட் முக்கிய சொல் வழியாக கையாளப்படுகிறது, இது கான்ஸ்ட்டுக்கான வைல்டு கார்டாக செயல்படுகிறது, மாறாதது, அல்லது தகுதியற்றது (மாறி), விளைவுஃ இன்அவுட் (சார்) * ஸ்ட்ராச்சர் (இன்அவுட் (சார்) * எஸ், இன்ட் இந்த தீர்வை ரிச்சி முன்மொழிந்தார், பின்னர் ஏற்றுக்கொண்டார். இந்த வேறுபாடு சி மற்றும் சி + + இன் பொருந்தக்கூடிய தன்மையின் தோல்விகளில் ஒன்றாகும். C23 முதல், இந்த சிக்கல் பொதுவான செயல்பாடுகளைப் பயன்படுத்துவதன் மூலம் தீர்க்கப்படுகிறது. சிக்கலால் பாதிக்கப்பட்ட எஸ்டிஆர்சிஆர் மற்றும் பிற செயல்பாடுகள் ஒன்று அவர்களுக்கு அனுப்பப்பட்டால் ஒரு கான்ஸ்ட் சுட்டிக்காட்டி மற்றும் தகுதியற்ற சுட்டிக்காட்டி அவர்களுக்கு அனுப்பப்பட்டால் தகுதியற்ற சுட்டிக்காட்டி ஆகியவற்றைத் திருப்பித் தரும். D இன் பதிப்பு 2 இல், கான்ஸ்ட் தொடர்பான இரண்டு முக்கிய வார்த்தைகள் உள்ளன. மாறாத முக்கிய சொல் எந்தவொரு குறிப்பு மூலமாகவும் மாற்றியமைக்க முடியாத தரவைக் குறிக்கிறது. கான்ஸ்ட் முக்கிய சொல் மாற்றத்தக்க தரவின் மாறாத பார்வையைக் குறிக்கிறது. சி + + கான்ஸ்ட் போலல்லாமல், டி கான்ஸ்ட் மற்றும் மாறாதவை "ஆழமானவை" அல்லது, மேலும் ஒரு கான்ஸ்ட் அல்லது மாறாத பொருளின் மூலம் அடையக்கூடிய எதுவும் முறையே கான்ஸ்ட் அல்லது மாறாதவை. டி இன்ட் [] ஃபூ = புதிய இன்ட் [5] இல் மாறாத கான்ஸ்ட்டின் எடுத்துக்காட்டு;// ஃபூ மாற்றத்தக்கது. கான்ஸ்ட் இன்ட் [] பார் = ஃபூ;// பார் என்பது மாற்றத்தக்க தரவுகளின் கான்ஸ்ட் பார்வை ஆகும். மாறாத இன்ட் [] பாஸ் = ஃபூ;// பிழைஃ மாறாத தரவுகளின் அனைத்து பார்வைகளும் மாறாததாக இருக்க வேண்டும். மாறாத int [] எண்கள் = புதிய மாறாத (int) [5];// எண்களுக்கான மாற்றத்தக்க குறிப்பு எதுவும் உருவாக்கப்பட முடியாது. கான்ஸ்ட் இன்ட் [] கான்ஸ்டின்ம்கள் = எண்கள்;// வேலை செய்கிறது. மாறாதது மறைமுகமாக கான்ஸ்ட்டாக மாற்றக்கூடியது. int [] மாற்றத்தக்க எண்கள் = எண்கள்;// பிழைஃ மாறாத தரவுகளின் மாற்றத்தக்க காட்சியை உருவாக்க முடியாது. டி வகுப்பில் இடைநிலை அல்லது ஆழமான கான்ஸ்ட்டின் எடுத்துக்காட்டு ஃபூ {ஃபூ அடுத்தது; இன்ட் எண்;} மாறாத ஃபூ ஃபூ = புதிய மாறாதது (ஃபூ); foo.next.num = 5;// தொகுக்காது. foo.next என்பது மாறாத (ஃபூ) வகையைச் சேர்ந்தது. //foo.next.num என்பது மாறாத (int) வகையைச் சேர்ந்தது. வரலாற்று கான்ஸ்ட் 1981 ஆம் ஆண்டில் சி + + க்கு முன்னோடியான கிளாஸ்ஸுடன் சி இல் பிஜார்னே ஸ்ட்ரூஸ்ட்ரப் என்பவரால் அறிமுகப்படுத்தப்பட்டது, இது முதலில் ரீட் ஒன்லி என்று அழைக்கப்பட்டது. உந்துதலைப் பொறுத்தவரை, ஸ்ட்ரூஸ்ட்ரப் எழுதுகிறார்ஃ "இது இரண்டு செயல்பாடுகளைச் செய்ததுஃ நோக்கம் மற்றும் வகை விதிகளுக்குக் கீழ்ப்படும் ஒரு குறியீட்டு மாறிலியை வரையறுக்கும் ஒரு வழியாக (அதாவது, ஒரு மேக்ரோவைப் பயன்படுத்தாமல்) மற்றும் நினைவகத்தில் மாறாத ஒரு பொருளைக் கருதுவதற்கான ஒரு வழியாகும்". முதல் பயன்பாடு, மேக்ரோக்களுக்கு ஒரு நோக்கம் மற்றும் தட்டச்சு மாற்றாக, இன்-லைன் முக்கிய சொல் வழியாக செயல்பாடு போன்ற மேக்ரோக்களுக்கு ஒத்ததாக நிறைவேற்றப்பட்டது. நிலையான சுட்டிகள் மற்றும் * கான்ஸ்ட் குறியீடு ஆகியவை டென்னிஸ் ரிச்சியால் பரிந்துரைக்கப்பட்டன, எனவே அவை ஏற்றுக்கொள்ளப்பட்டன. கான்ஸ்ட் பின்னர் தரப்படுத்தலின் ஒரு பகுதியாக C இல் ஏற்றுக்கொள்ளப்பட்டது, மேலும் C89 (மற்றும் அடுத்தடுத்த பதிப்புகள்) இல் மற்ற வகை தகுதி, கொந்தளிப்புடன் தோன்றுகிறது. 1987 டிசம்பரில் நடைபெற்ற X3J11 குழுவின் கூட்டத்தில் மேலும் ஒரு தகுதிபெற்ற நோலியாஸ் பரிந்துரைக்கப்பட்டது, ஆனால் அது நிராகரிக்கப்பட்டது; அதன் இலக்கு இறுதியில் C99 இல் உள்ள கட்டுப்படுத்தப்பட்ட முக்கிய வார்த்தையால் நிறைவேற்றப்பட்டது. ரிச்சி இந்த சேர்த்தல்களுக்கு அதிக ஆதரவளிக்கவில்லை, அவை "தங்கள் எடையை சுமக்கவில்லை" என்று வாதிட்டார், ஆனால் இறுதியில் அவை தரத்திலிருந்து அகற்றப்பட வேண்டும் என்று வாதிடவில்லை. டி பின்னர் சி + + இலிருந்து கான்ஸ்ட்டை மரபுரிமையாகப் பெற்றது, அங்கு இது ஒரு வகை கட்டமைப்பாளர் (வகை தகுதி அல்ல) என்று அழைக்கப்படுகிறது, மேலும் தொடர்புடைய பயன்பாட்டு நிகழ்வுகளைக் கையாள மாறாத மற்றும் வெளியே உள்ள இரண்டு வகை கட்டமைப்பாளர்களைச் சேர்த்தது. பிற மொழிகள் பெரும்பாலும் மேலோட்டமாக ஒத்த கட்டமைப்புகளைக் கொண்டிருந்தாலும், கான்ஸ்ட் முக்கிய வார்த்தையைப் பயன்படுத்தலாம் என்றாலும், பிற மொழிகள் சி/சி + + வகையின் நிலைத்தன்மையைக் கொண்டிருப்பதைப் பின்பற்றுவதில்லை. பொதுவாக இது மாறிலிகளுக்கு (நிலையான பொருள்கள்) மட்டுமே பயன்படுத்தப்படுகிறது. சி #ஒரு கான்ஸ்ட் முக்கிய வார்த்தையைக் கொண்டுள்ளது, ஆனால் முற்றிலும் மாறுபட்ட மற்றும் எளிமையான சொற்பொருள்களுடன்ஃ இது ஒரு தொகுப்பு-நேர மாறிலி என்று பொருள்படும், மேலும் இது வகையின் ஒரு பகுதியாக இல்லை. நிம் சி #ஐப் போலவே ஒரு கான்ஸ்ட் முக்கிய வார்த்தையைக் கொண்டுள்ளதுஃ இது வகையின் ஒரு பகுதியை உருவாக்குவதை விட தொகுப்பு-நேர மாறிலியையும் அறிவிக்கிறது. இருப்பினும், நிம்மில், தொகுப்பு நேரத்தில் மதிப்பீடு செய்யக்கூடிய எந்தவொரு வெளிப்பாட்டிலிருந்தும் ஒரு மாறிலியை அறிவிக்க முடியும். சி #இல், சி #உள்ளமைக்கப்பட்ட வகைகளை மட்டுமே கான்ஸ்ட்டாக அறிவிக்க முடியும்; வகுப்புகள், கட்டமைப்புகள் மற்றும் வரிசைகள் உள்ளிட்ட பயனர் வரையறுக்கப்பட்ட வகைகள் கான்ஸ்ட்டாக இருக்க முடியாது. ஜாவாவில் கான்ஸ்ட் இல்லை-அதற்கு பதிலாக இறுதி உள்ளது, இது உள்ளூர் "மாறி" அறிவிப்புகளுக்கு பயன்படுத்தப்படலாம் மற்றும் அடையாளங்காட்டிக்கு பொருந்தும், வகை அல்ல. இது பொருள் உறுப்பினர்களுக்கு வேறுபட்ட பொருள் சார்ந்த பயன்பாட்டைக் கொண்டுள்ளது, இது பெயரின் தோற்றம். ஜாவா மொழி விவரக்குறிப்பு கான்ஸ்ட்டை ஒரு ஒதுக்கப்பட்ட முக்கிய வார்த்தையாக கருதுகிறது-அதாவது, மாறி அடையாளங்காட்டியாகப் பயன்படுத்த முடியாத ஒன்று-ஆனால் அதற்கு எந்த சொற்பொருளையும் ஒதுக்குவதில்லைஃ இது ஒரு ஒதுக்கப்பட்ட சொல் (இது அடையாளங்காட்டிகளில் பயன்படுத்த முடியாது) ஆனால் ஒரு முக்கிய சொல் அல்ல (அதற்கு சிறப்பு அர்த்தம் இல்லை). C + +-பாணி கான்ஸ்ட் முறைகள் மற்றும் போயிண்டர் முதல் கான்ஸ்ட் வகை ஆகியவற்றைச் சேர்க்க ஜாவா மொழியின் நீட்டிப்பை அனுமதிக்க முக்கிய வார்த்தையின் முன்பதிவு ஏற்பட்டது என்று கருதப்படுகிறது. கான்ஸ்டன்ட் சரியான தன்மையை செயல்படுத்துவதற்கான ஒரு மேம்பாட்டு கோரிக்கை டிக்கெட் ஜாவா சமூக செயல்முறையில் உள்ளது, ஆனால் பின்தங்கிய-இணக்கமான பாணியில் செயல்படுத்துவது சாத்தியமில்லை என்ற அடிப்படையில் 2005 இல் மூடப்பட்டது. சமகால அடா 83 சுயாதீனமாக ஒரு நிலையான பொருள் மற்றும் ஒரு நிலையான முக்கிய சொல் பற்றிய கருத்தைக் கொண்டிருந்தது, உள்ளீட்டு அளவுருக்கள் மற்றும் வளைய அளவுருக்கள் மறைமுகமாக நிலையானவை. இங்கே மாறிலி என்பது பொருளின் பண்பு, வகை அல்ல. ஜாவாஸ்கிரிப்ட் ஒரு கான்ஸ்ட் பிரகடனத்தைக் கொண்டுள்ளது, இது ஒரு பிளாக்-ஸ்கோப்டு மாறியை வரையறுக்கிறது, அதை மறுபரிசீலனை செய்யவோ மறுபரிசீலனை செய்யவோ முடியாது. இது மறுவரையறை செய்ய முடியாத ஒரு மாறிக்கு ஒரு வாசிப்பு-மட்டும் குறிப்பை வரையறுக்கிறது, ஆனால் சில சூழ்நிலைகளில் மாறியின் மதிப்பு தானாகவே மாறக்கூடும், அதாவது மாறி ஒரு பொருளைக் குறிக்கிறது மற்றும் அதன் பண்பு மாற்றப்படுகிறது. ஹெர்ப் சுட்டரின் "கான்ஸ்டன்ட் ஆப்டிமைசேஷன்?" என்ற ஒற்றை பணி கட்டுப்பாடு பாயிண்டர் மாற்றுப்பெயர் குறிப்புகள் குறிப்புகள் வெளிப்புற இணைப்புகள் "கான்ஸ்டன்ட்-கரெக்ட்னஸ்" ஐயும் பார்க்கவும். ஹெர்ப் சுட்டர் எழுதிய சி + + எஃப். ஏ. க்யூ லைட்ஃ மார்ஷல் க்ளைனின் கான்ஸ்டன்ட் சரியான தன்மை புரூஸ் எக்கல் எழுதிய இலவச மின்னணு புத்தகமான திங்கிங் இன் சி + + இலிருந்து "மதிப்பு மாற்று" வால்டர் பிரைட் எழுதிய "ஹியர் ஏ கான்ஸ்டன்ட், தெரே ஏ கான்ஸ்டன்ட்" டி நிரலாக்க மொழி விவரக்குறிப்பிலிருந்து, பதிப்பு 2 (சோதனை) சி நிரலாக்க மொழி குடும்ப தரவு வகைகள் எடுத்துக்காட்டு சி குறியீடு கட்டுரைகள் கொண்ட கட்டுரைகள் எடுத்துக்காட்டாக சி + + குறியீடு நிரலாக்க மொழி தலைப்புகளுடன்