type conversions c
C ++ में समर्थित विभिन्न प्रकार के रूपांतरण देखें।
हमें उम्मीद है कि आपको हमारे पूर्व के ट्यूटोरियल से C ++ में उपलब्ध सभी डेटा प्रकारों के बारे में पता होना चाहिए। कई बार, एक आवश्यकता ऐसी उत्पन्न हो सकती है कि हमें एक प्रकार से दूसरे में बदलने की आवश्यकता होती है। इसे टाइप रूपांतरण या टाइप-कास्टिंग कहा जाता है।
इस ट्यूटोरियल में, हम C ++ में समर्थित विभिन्न प्रकार के रूपांतरणों पर चर्चा करेंगे।
क्या .swf फाइलें खेल सकते हैं
=> फ्री सी ++ कोर्स के लिए यहां क्लिक करें।
आप क्या सीखेंगे:
वार्तालाप टाइप करें
C ++ दो प्रकार के रूपांतरणों का समर्थन करता है:
- अंतर्निहित प्रकार रूपांतरण: अंतर्निहित प्रकार रूपांतरण स्वचालित है। इस प्रकार के रूपांतरण में उपयोगकर्ता का कोई हस्तक्षेप नहीं होता है और संकलक सीधे रूपांतरण का संचालन करता है। रूपांतरण आमतौर पर तब किया जाता है जब अभिव्यक्ति में एक से अधिक प्रकार के डेटा होते हैं। लेकिन आम तौर पर, इस प्रकार के रूपांतरण में डेटा की हानि, संकेतों की हानि या डेटा के अतिप्रवाह की संभावना होती है।
- स्पष्ट प्रकार रूपांतरण: स्पष्ट प्रकार का रूपांतरण उपयोगकर्ता-परिभाषित है और आम तौर पर इसे 'टाइप-कास्टिंग' कहा जाता है। यहां उपयोगकर्ता आवश्यकताओं के आधार पर एक डेटा प्रकार के मूल्य को दूसरे में परिवर्तित या परिवर्तित करता है। इस प्रकार के रूपांतरण अधिक सुरक्षित होते हैं।
अब हम दोनों प्रकार के रूपांतरण को विस्तार से देखेंगे।
निहित रूपांतरण
अंतर्निहित रूपांतरण में, संकलक रूपांतरणों को एक डेटा प्रकार से दूसरे में ले जाता है जब भी एक अभिव्यक्ति में एक से अधिक डेटा प्रकार होते हैं। डेटा के नुकसान को रोकने के लिए, अन्य डेटा प्रकारों के सभी चर सबसे बड़े डेटा प्रकार में परिवर्तित हो जाते हैं। इसे प्रचार कहते हैं।
आइए एक कोड उदाहरण का उपयोग करके स्पष्ट रूपांतरण को समझें।
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< आउटपुट:
10 + 'ए' = 75
फ्लोट वैल (10 + ‘a’) = 107
var_int = 1000
उपरोक्त कोड उदाहरण अंतर्निहित रूपांतरण को प्रदर्शित करता है। हमने एक पूर्णांक और एक वर्ण चर को क्रमशः मान 10 और 'ए' के साथ घोषित किया है। जब हम इन दो चर को जोड़ते हैं, तो एक अंतर्निहित रूपांतरण होता है।
जैसा कि पूर्णांक इस अभिव्यक्ति में बड़ा प्रकार है, वर्ण चर मान 'ए' को इसके पूर्णांक के बराबर में परिवर्तित किया जाता है, अर्थात मान 65 (ASCII मान)। इस प्रकार अभिव्यक्ति का परिणाम 75 है।
अगली अभिव्यक्ति में, हम पूर्णांक और वर्ण (’a -> 97) जोड़ते हैं और फिर फ्लोट करने के लिए परिणाम निर्दिष्ट करते हैं। इस प्रकार अभिव्यक्ति का परिणाम संकलक द्वारा फ्लोट में परिवर्तित किया जाता है।
तीसरी अभिव्यक्ति में, एक संक्षिप्त इंट चर को पूर्णांक में परिवर्तित किया जाता है।
ध्यान दें : अंतर्निहित रूपांतरण के मामले में, यदि कंपाइलर डेटा के संभावित नुकसान का पता लगाता है, तो यह इस आशय की चेतावनी को फ़्लैश कर सकता है।
स्पष्ट रूपांतरण
स्पष्ट रूपांतरण को 'टाइप-कास्टिंग' के रूप में भी जाना जाता है क्योंकि हम एक डेटा प्रकार को दूसरे डेटा प्रकार में डालते हैं। यहां, उपयोगकर्ता स्पष्ट रूप से कास्टिंग को परिभाषित करते हैं, निहितार्थ के विपरीत, जहां कंपाइलर आंतरिक रूप से रूपांतरण करता है।
हम दो तरीकों से स्पष्ट रूपांतरण कर सकते हैं:
# 1) असाइनमेंट ऑपरेटर का उपयोग करना
एक प्रकार से असाइनमेंट ऑपरेटर का उपयोग करके स्पष्ट रूपांतरण या टाइपकास्टिंग को जबरदस्ती किया जाता है। यहां हम असाइनमेंट ऑपरेटर का उपयोग करके एक डेटा प्रकार को दूसरे डेटा प्रकार में डालते हैं या परिवर्तित करते हैं।
सामान्य वाक्यविन्यास है:
(data type) expression;
निम्नलिखित उदाहरण यह बताते हैं:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< आउटपुट:
योग = 5563
कम्प = 5563.2
हमने उपरोक्त उदाहरण में असाइनमेंट ऑपरेटर का उपयोग करके स्पष्ट कास्टिंग दिखाया है। सबसे पहले, हम एक पूर्णांक प्रकार के प्रकार के चर वेतन का भुगतान करते हैं। इसके बाद, हम पूर्णांक चर राशि को एक दोहरे प्रकार में डालते हैं।
जैसा कि आउटपुट में दिखाया गया है, जिस प्रकार से हम कास्ट करते हैं वह अभिव्यक्ति के परिणाम के अंतिम प्रकार को इंगित करता है।
यह लाभप्रद है क्योंकि उपयोगकर्ता आवश्यकताओं के अनुसार अभिव्यक्ति के प्रकार को बदल सकता है।
# 2) कास्ट ऑपरेटर का उपयोग करना
इस प्रकार की कास्टिंग में, हम एक 'कास्ट ऑपरेटर' का उपयोग करते हैं, जो एक प्रकार से दूसरे प्रकार में बदलने के लिए एक अपर ऑपरेटर है।
कास्टिंग के प्रकार
हमारे द्वारा उपयोग किए गए कास्ट ऑपरेटर के आधार पर हमारे पास निम्न प्रकार की कास्टिंग हैं:
(१) स्टेटिक कास्ट
कास्ट ऑपरेटर का उपयोग करके सभी टाइपकास्टिंग में स्थिर कलाकार सबसे सरल है । स्टैटिक कास्ट उन सभी रूपांतरणों को करने में सक्षम होता है जो निहित रूप से किए जाते हैं। यह एक दूसरे से संबंधित वर्गों के पॉइंटर्स के बीच रूपांतरण भी करता है (अपस्टेड -> व्युत्पन्न से आधार या डाउनकास्ट -> आधार से व्युत्पन्न तक)।
उपरोक्त सूचीबद्ध रूपांतरणों के अलावा, स्थिर कलाकार किसी भी सूचक को शून्य * में बदलने में सक्षम है।
स्टैटिक कास्ट संकलित समय कास्ट है। इसका मतलब यह है कि रनटाइम में कोई चेक नहीं किया गया है, यह देखने के लिए कि प्रदर्शन कास्ट वैध है या नहीं। इस प्रकार यह प्रोग्रामर की जिम्मेदारी है कि वह यह सुनिश्चित करे कि रूपांतरण सुरक्षित और मान्य था।
दूसरे शब्दों में, उपयोगकर्ता को यह सुनिश्चित करना होगा कि परिवर्तित वस्तु गंतव्य डेटा प्रकार के संबंध में पूर्ण थी।
हम एक स्थिर कलाकार को निम्नानुसार निर्दिष्ट करते हैं:
static_cast (expression)
हमें एक उदाहरण का उपयोग करके स्टेटिक कास्ट को समझने दें।
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<उपरोक्त उदाहरण में, हमने मूल्य ‘A’ वाले वर्ण चर को शामिल करने के लिए कोड को थोड़ा संशोधित किया है। फिर हम एक पूर्णांक सूचक की घोषणा करते हैं और एक पात्र को पूर्णांक सूचक में परिवर्तित करने के लिए एक स्थिर कास्ट लागू करते हैं।
जब हम इस कार्यक्रम को संकलित करते हैं तो हमें निम्नलिखित आउटपुट मिलते हैं।
फ़ंक्शन में function int main () ':
10:35: त्रुटि: _ char * 'से ’int * टाइप करने के लिए अमान्य static_cast
यह प्रोग्राम स्थिर प्रदर्शन के लिए एक त्रुटि देता है क्योंकि यह अमान्य है। इस प्रकार स्टेटिक कास्ट केवल मान्य प्रकार की कास्टिंग या रूपांतरण की अनुमति देता है और जब हम कुछ अवांछनीय टाइपकास्टिंग करने की कोशिश करते हैं तो एक त्रुटि देता है।
# 2) डायनामिक कास्ट
डायनामिक कास्ट एक रनटाइम कास्ट है जो कलाकारों की वैधता की जांच करने के लिए किया जाता है। डायनामिक कास्ट केवल क्लास पॉइंटर्स और संदर्भों पर किया जाता है। यदि कलाकार विफल रहता है, तो अभिव्यक्ति एक पूर्ण मान देता है।
डायनामिक कास्ट एक तंत्र के रूप में जाना जाता है RTTI (रनटाइम प्रकार की पहचान) । RTTI ऑब्जेक्ट के डेटा प्रकार के बारे में सभी जानकारी रनटाइम पर उपलब्ध है और केवल उन वर्गों के लिए उपलब्ध है जिनके पास कम से कम एक वर्चुअल फ़ंक्शन (पॉलीमॉर्फिक प्रकार) है। RTTI रनटाइम के दौरान या निष्पादन के समय ऑब्जेक्ट प्रकार का निर्धारण करने की अनुमति देता है।
डायनामिक कास्ट को समझने के लिए एक उदाहरण का प्रयास करते हैं।
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
इस कार्यक्रम में, हमने दो वर्गों को परिभाषित किया है, एक आभासी फ़ंक्शन के साथ आधार और व्युत्पन्न एक आधार वर्ग, आधार है।
चित्र के साथ यूट्यूब एमपी 3 कनवर्टर करने के लिए
मुख्य फ़ंक्शन में, हम बेस क्लास पॉइंटर द्वारा इंगित एक व्युत्पन्न वर्ग ऑब्जेक्ट बनाते हैं। तब हम डायनेमिक_कास्ट करते हैं बेस पॉइंटर पर एक व्युत्पन्न वर्ग की ओर इशारा करते हुए इसे एक व्युत्पन्न क्लास पॉइंटर में डालने के लिए।
बेस क्लास की तरह, बेस पॉलिमॉर्फिक (वर्चुअल फ़ंक्शन होता है), डायनेमिक_कास्ट सफल है।
ध्यान दें: यदि हम उपरोक्त वर्ग से आभासी फ़ंक्शन को हटाते हैं, तो डायनेमिक_कास्ट विफल हो जाएगा क्योंकि ऑब्जेक्ट के लिए RTTI जानकारी उपलब्ध नहीं होगी।
गतिशील कलाकारों में रन-टाइम पर ओवर-सेफ्टी का ओवरहेड होता है।
# 3) पुनर्निवेश कास्ट
इस प्रकार की कास्ट का उपयोग करना सबसे खतरनाक है क्योंकि यह किसी भी प्रकार की वस्तु पर काम करता है बिना वर्गों के एक दूसरे से संबंधित है।
Reintepret_cast किसी भी पॉइंटर्स पर काम करता है और यह किसी भी प्रकार के पॉइंटर को किसी अन्य प्रकार के लिए धर्मान्तरित करता है, भले ही संकेत एक दूसरे से संबंधित हों या नहीं। यह इंगित नहीं करता है कि सूचक या संकेतक द्वारा इंगित किया गया डेटा समान है या नहीं।
कास्ट ऑपरेटर केवल एक पैरामीटर लेता है, स्रोत पॉइंटर को कन्वर्ट करने के लिए और कोई मान वापस नहीं करता है। यह केवल पॉइंटर प्रकार को परिवर्तित करता है।
जब तक आवश्यकता न हो हमें उपयोग नहीं करना चाहिए। हम आमतौर पर स्रोत सूचक को उसके मूल प्रकार में टाइप करते हैं।
हम ज्यादातर बिट्स के साथ काम करने के लिए उपयोग करते हैं। जब बूलियन मानों पर उपयोग किया जाता है, तो बूलियन मान पूर्णांक मानों में परिवर्तित हो जाते हैं अर्थात 1 सत्य के लिए और 0 झूठे के लिए।
आइये देखते हैं रीइंटरप्रिट कास्ट का एक उदाहरण:
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
आउटपुट:
0x3ef3090
सेवा मेरे
97
सेवा मेरे
उपरोक्त उदाहरण में, हमने एक पूर्णांक सूचक ptr को 97 के मान की ओर इशारा करते हुए घोषित किया है। इसके बाद, हम एक वर्ण सूचक ch की घोषणा करते हैं और ptr को इसका उपयोग करते हैं।
अगला, हम विभिन्न मूल्यों को प्रिंट करते हैं। पहला प्रिंट हम ptr है जो एक पूर्णांक स्थान पर इंगित करता है। इसलिए यह एक पते को प्रिंट करता है।
अगले मान ch में मान 97 है और इस प्रकार यह 'a' प्रिंट करता है जो ASCII के 97 के बराबर है। अगला मान '* ptr' का मान 97 है जबकि '* ch' का ASCII के बराबर 97 '' a 'है, क्योंकि यह का उपयोग करता है reinterpret_cast।
# 4) कास्ट कास्ट
कास्ट ऑपरेटर का उपयोग स्रोत पॉइंटर की गति को बदलने या हेरफेर करने के लिए किया जाता है। जोड़-तोड़ करके, हमारा मतलब है कि यह या तो एक नॉन-कास्ट पॉइंटर के लिए कब्ज सेट करने के लिए हो सकता है या कॉस्ट पॉइंटर से कॉन्स्टेंस को हटा सकता है।
ऑपरेटर को सफलतापूर्वक कास्ट करने की शर्त यह है कि पॉइंटर और जो सोर्स डाला गया है वह उसी प्रकार का होना चाहिए।
इसे समझने के लिए एक उदाहरण लेते हैं।
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
इस उदाहरण में, हम देखते हैं कि फ़ंक्शन 'printVal' एक नॉन-कॉन्स्टेंट पॉइंटर को स्वीकार करता है। मुख्य फ़ंक्शन में, हमारे पास एक कास्ट वैरिएबल assigned वैल्यू ’है जिसे कॉन्स्टेंट पॉइंटर को सौंपा गया है।
फ़ंक्शन प्रिंटवैल में इस कॉन्स्ट पॉइंटर को पास करने के लिए, हम कॉन्स्टेंस को हटाने के लिए आवेदन करके इसे कास्ट करते हैं। तब हम वांछित परिणाम प्राप्त करने के लिए सूचक ptr_cast को फ़ंक्शन में पास करते हैं।
निष्कर्ष
इसके साथ, हम C ++ में टाइप रूपांतरण के इस विषय को लपेटेंगे। हमने उन सभी अंतर्निहित और स्पष्ट रूपांतरणों के बारे में देखा है जो C ++ में उपयोग किए जाते हैं।
हालांकि, किसी को यह पता होना चाहिए कि डेटा की हानि और इस तरह की अन्य कठिनाइयों को रोकने के लिए, रूपांतरण या टाइपकास्टिंग को बुद्धिमानी से लागू किया जाना चाहिए, अगर स्थिति के उपयोग की आवश्यकता हो।
=> यहां शुरुआती सी ++ प्रशिक्षण गाइड देखें।
अनुशंसित पाठ
- सर्वश्रेष्ठ मुफ्त सी # ट्यूटोरियल श्रृंखला: शुरुआती के लिए अंतिम सी # गाइड
- C ++ में टाइप क्वालिफायर और स्टोरेज क्लासेस
- प्रवासन परीक्षण के प्रकार: प्रत्येक प्रकार के लिए परीक्षण परिदृश्यों के साथ
- किसी परियोजना के लिए किस प्रकार के परीक्षण का निर्णय लेना आवश्यक है? - मैनुअल या स्वचालन
- C ++ डेटा प्रकार
- एचपी लोडरनर ट्यूटोरियल के साथ लोड परीक्षण
- C ++ में चर
- उदाहरणों में सी ++ में टेम्पलेट