2011-01-17 32 views
10

संभव डुप्लिकेट:
What is this weird colon-member syntax in the constructor?क्या करता है: :: सी ++ में मतलब है?

मैंने सोचा था कि मैं सब कुछ जानता था, लेकिन कुछ हमेशा पॉप अप करने लगता है। शायद मैं कुछ भूल रहा हूँ। : ::name का क्या अर्थ है? मुझे संदेह है कि ::google का अर्थ है वैश्विक नामस्थान google, protobuf, message का उपयोग करें। लेकिन : इससे पहले क्या करता है? बाईं ओर कोई पाठ नहीं है, इसलिए यह एक लेबल नहीं हो सकता है (या यह कर सकता है ?!)। तो यह क्या है?

Namespace::Namespace() 
    : ::google::protobuf::Message() { 
    SharedCtor(); 
} 

-edit- मुझे मूर्खतापूर्ण लगता है, मुझे इशारा मिला। मैंने सोचा कि मैं फंक्शन बॉडी के अंदर देख रहा था। मैं बहुत उम्मीद कर रहा था कि यह कुछ नया होगा।

+0

क्या नाम 'नेमस्पेस' है? – Naveen

+4

जाहिर है, और ऐसा लगता है कि यह :: google :: protobuf :: संदेश से लिया गया है। – EboMike

+6

यदि आप इस तरह की महत्वपूर्ण मूल भाषा सुविधा * कन्स्ट्रक्टर प्रारंभकर्ता सूची * के बारे में नहीं जानते हैं, तो आप अभी भी "सब कुछ जानने" से बहुत दूर हैं। – AnT

उत्तर

12

पहला कॉलन : वास्तव में एक संकेत के रूप में है कि एक प्रारंभिक सूची क्या है। यह कक्षा के कन्स्ट्रक्टर में उस वर्ग के डेटा सदस्यों को वास्तव में निष्पादित करने से पहले कुछ प्रारंभिक मूल्य (इसलिए नाम) देने के तरीके के रूप में प्रदर्शित हो सकता है।

एक छोटा सा उदाहरण के लिए, का प्रारूप अलग:

class Foo { 
public: 
    Foo() : 
     x(3),  // int initialized to 3 
     str("Oi!"), // std::string initialized to be the string, "Oi!" 
     list(10) // std::vector<float> initialized with 10 values 
    { /* constructor body */ } 

private: 
    int x; 
    std::string str; 
    std::vector<float> list; 
}; 

संपादित

एक अतिरिक्त नोट के रूप में, यदि आप एक वर्ग है कि एक और उपवर्गों है, जिस तरह से आप अपने आह्वान सुपर क्लास निर्माता इस तरह ठीक है , प्रारंभकर्ता सूची के अंदर। हालांकि, किसी सदस्य के नाम को निर्दिष्ट करने के बजाय, आप सुपरक्लास का नाम निर्दिष्ट करते हैं।

7

:: वैश्विक दायरे को संदर्भित करता है। उदाहरण के लिए:

void f() { ... } // (1) 

namespace ns 
{ 
    void f() { ... } // (2) 

    void g() 
    { 
     f(); // calls (2) 
     ::f(); // calls (1) 
    } 
} 
+0

-1 मैं पहले से ही :: वैश्विक हूं। और मैंने जवाब नहीं दिया कि मैं क्या पूछता हूं, ':' क्या है। –

+0

@ acidzombie24 रुको, आप मुझे वोट मत दें क्योंकि मैंने जो कहा वह गलत है (जो यह नहीं है), लेकिन क्योंकि मैंने आपको कुछ बताया है जिसे आप पहले ही जानते हैं? –

+1

नहीं, मैंने मतदान किया क्योंकि आपने मेरे प्रश्न का उत्तर नहीं दिया था। > "क्या है: :: नाम का मतलब है?" और "लेकिन इससे पहले क्या करता है?" –

19

एक निर्माता में, एक पेट का उपयोग कर चर प्रारंभ और/या माता पिता के निर्माता फोन करने के लिए प्रयोग किया जाता है। उदाहरण के लिए:

struct foo { 
    foo(); 
    foo(int var); 
}; 

struct bar : public foo { 
    bar(); 
    int x; 
}; 

अब आप इस तरह बार के निर्माता कर सकता है:

bar::bar() 
: x(5) 
{ 
} 

5. करने के लिए एक्स सेट या जो:

bar::bar() 
: foo(8) 
, x(3) 
{ 
} 

एक के रूप में 8 के साथ foo की दूसरी निर्माता का उपयोग करता है कि तर्क, फिर x से 3.

यह आपके कोड में मजाकिया लगता है क्योंकि आपके पासका संयोजन है वैश्विक नामस्थान प्राप्त करने के लिए शुरुआत के लिएऔर ::

+0

मुझे मूर्खतापूर्ण लगता है, मैंने सोचा कि मैं फ़ंक्शन बॉडी के अंदर देख रहा था। +1 और स्वीकार किया गया। –

+2

मूर्खतापूर्ण महसूस करने का कोई कारण नहीं है। मैंने बहुत सी चीजें देखी हैं जो मुझे पहले डबल-लेते हैं। कुछ प्रोग्रामिंग भाषाएं वास्तव में आपके दिमाग से गड़बड़ कर सकती हैं :) – EboMike

+0

पूर्ण और स्पष्ट टिप्पणी के लिए बहुत बहुत धन्यवाद EboMike। – Chavoosh

3

वैश्विक नामस्थान से विस्तारित विरासत के साथ काम करने लगता है।

class baseClass{ 
    public: 
    int someVal; 
}; 

class childClass : baseClass 
{ 
    public: 
    int AnotherVal; 
} 

बाद में दिए गए अन्य उत्तर अधिक मजबूत हैं।

संबंधित मुद्दे