2010-02-17 14 views
22

आप इस postसी ++: :: के लिए क्या है?

के स्वीकार किए जाते हैं जवाब देने के लिए जाना अगर किसी कारण है कि वह का उपयोग करता है पर विस्तृत कृपया सकते हैं:

double temp = ::atof(num.c_str()); 

और नहीं बस

double temp = atof(num.c_str()); 
इसके अलावा

, है कि यह एक अच्छा अभ्यास माना जाता है जब आप "शुद्ध" वैश्विक कार्यों का उपयोग करते हैं तो उस वाक्यविन्यास का उपयोग करने के लिए?

+0

इसके अलावा, आप एक स्टैक ओवरफ्लो लिंक कैसे बनाते हैं जैसे कि जब कोई उस पर क्लिक करता है, तो यह सीधे उत्तर (और पृष्ठ की शुरुआत में नहीं) पर जाता है? – sivabudh

+4

प्रत्यक्ष-से-उत्तर लिंक के संबंध में, "लिंक" लिंक के उत्तर के निचले बाएं कोने में देखें। –

+2

इस तरह: http://stackoverflow.com/questions/1012571/stdstring-to-float-or-double/1012604#1012604 –

उत्तर

32

यह वैश्विक संस्करण का उपयोग करता है, जिसे स्थानीय क्षेत्र में घोषित नहीं किया गया है। तो अगर किसी ने आपकी कक्षा में atof घोषित किया है, तो यह वैश्विक का उपयोग करना सुनिश्चित करेगा।

#include <iostream> 

using namespace std; 

int n = 12; // A global variable 

int main() { 
    int n = 13; // A local variable 
    cout << ::n << endl; // Print the global variable: 12 
    cout << n << endl; // Print the local variable: 13 
} 
18

:: गुंजाइश संकल्प ऑपरेटर है:

Wikipedia on this subject पर एक नज़र डालें। इस परिदृश्य में, एक यूनरी ऑपरेटर, is to ensure that the name (atof) is always looked up in the global scope के रूप में इसका उपयोग - यह लुकअप के साथ हस्तक्षेप से छिपने वाले नाम को रोकने के लिए उपयोगी हो सकता है।

+0

यह मजाकिया है, माइक्रोसॉफ्ट और विकिपीडिया उदाहरण लगभग समान हैं - मुझे आश्चर्य है कि किसने कॉपी किया? – Skilldrick

+2

सबसे उल्लसित बात यह है कि यह शायद सी ++ के लिए 'std :: atof()' होना चाहिए;) –

1

::func() का अर्थ है कि यह फ़ंक्शन किसी विशिष्ट वर्ग से संबद्ध नहीं है। इसका उपयोग तब किया जाता है जब एक ही नाम के साथ कई फ़ंक्शन मौजूद होते हैं, और आप जो चाहते हैं उसके बीच भ्रम से बचने के लिए और विशिष्ट सदस्य फ़ंक्शंस आप स्कोप ऑपरेटर के साथ फ़ंक्शन नाम से पहले हैं।


सी ++ प्राइमर, 4 संस्करण, खंड 17.2.1 से:

"नाम वैश्विक क्षेत्र में परिभाषित किया - नाम किसी भी वर्ग, समारोह के बाहर की घोषणा की, या नाम स्थान - ग्लोबल नेम स्पेस अंदर परिभाषित कर रहे हैं वैश्विक। नामस्थान को प्रत्येक कार्यक्रम में स्पष्ट रूप से घोषित किया गया है और मौजूद है। प्रत्येक फ़ाइल जो वैश्विक दायरे में इकाइयों को परिभाषित करती है, उन नामों को वैश्विक नामस्थान में जोड़ती है।

स्कोप ऑपरेटर का उपयोग वैश्विक नामस्थान के सदस्यों को संदर्भित करने के लिए किया जा सकता है। क्योंकि वैश्विक नामस्थान है निहित, इसका नाम नहीं है; नोटेशन

::member_name 

वैश्विक नामस्थान के सदस्य को संदर्भित करता है। "

1

मान लें कि आपके पास f() फ़ंक्शन के दो संस्करण हैं जो एक नामस्थान के बाहर परिभाषित हैं और एक परिभाषित अंदर है। अब मान लें कि आपके पास एक ही नामस्थान में g() एक और फ़ंक्शन है। अब यदि आप f()g() के अंदर करते हैं तो यह उसी नामस्थान में परिभाषित एक को कॉल करेगा। लेकिन यदि आप वैश्विक संस्करण को कॉल करना चाहते हैं तो आपको ::f()

2

:: ऑपरेटर स्कोप रिज़ॉल्यूशन ऑपरेटर है।

जब क्लास विनिर्देशक के साथ ए :: ए जैसे प्रयोग किया जाता है, तो किसी भी विनिर्देशक के बिना उपयोग किए जाने पर कक्षा ए के डेटा मेमबर तक पहुंचने के लिए, यह वैश्विक चर का उपयोग करता है।

इसका मुख्य रूप से निम्नलिखित प्रतियोगिताओं में उपयोग किया जाता है।

  1. वैश्विक चरों को संदर्भित करने के लिए।
  2. कक्षा
  3. के स्थिर सदस्यों को संदर्भित करने के लिए अस्पष्टताओं से बचने के लिए, जब एक वर्ग एकाधिक [गैर-वर्चुअल आधार] कक्षाओं से प्राप्त होता है।
  4. निर्देश का उपयोग करने के साथ, व्युत्पन्न कक्षा में बेस क्लास फ़ंक्शंस का उपयोग करने के लिए, जब बेस क्लास में फ़ंक्शन के साथ व्युत्पन्न वर्ग के समान नाम होता है, लेकिन एक अलग प्रकार के लिए।
  5. वैश्विक दायरे में परिभाषित कार्यों तक पहुंचने के लिए, जब आपके पास एक ही हस्ताक्षर के साथ परिभाषित फ़ंक्शन होता है, जैसा कि डबल temp = :: atof (num.c_str()) में होता है;
  6. नेस्टेड कक्षाओं की वस्तुओं को बनाने के लिए।
संबंधित मुद्दे