2010-08-13 18 views
12
void weight_data::rev_seq(string &seq){ 
//TODO 
std::reverse(seq.begin(), seq.end()); 
} 

इस सी ++ विधि में, मुझे लगता है कि इस विधि कुछ भी वापस नहीं करता है, इसलिए उपसर्ग void, क्या ::weight_data और rev_seq(string &seq) के बीच संबंधों को बता करता है? धन्यवाद!:: सी ++ में :: मतलब क्या है?

+0

:: PHP में पामायम नेकुडोटायम कहा जाता है। –

उत्तर

25

void रिटर्न प्रकार है। :: स्कोप रिज़ॉल्यूशन ऑपरेटर है, इसलिए इसका मतलब है rev_seqweight_data के दायरे में है। weight_data या तो नामस्थान या कक्षा हो सकती है (जो आपने दिया है उसके आधार पर, यह कहना संभव नहीं है)।

+0

"weight_data" को "rev_seq" (लागू नहीं किया गया) नामक विधि के साथ एक.hpp फ़ाइल में एक स्ट्रक्चर के रूप में परिभाषित किया गया है, फिर एक.cpp फ़ाइल में, इस विधि को प्रश्न भाग – ladyfafa

+2

@ladyfafa में पूछा गया है: 'void weight_data :: rev_seq (स्ट्रिंग और seq) {...}' __is__ उस सदस्य फ़ंक्शन के कार्यान्वयन। – sbi

+0

@ एसबीआई: ठीक है, मैं देखता हूं; क्या इसे एक से अधिक बार लागू किया जा सकता है? यानी विभिन्न सीपीपी फाइलों में, "rev_seq" संरचना से अलग "rev_seq" संरचना के विभिन्न कार्यान्वयन के लिए "weight_data" – ladyfafa

13

सी ++ में,

  • A::B मतलब है B या तो namespace या class प्रकार A भीतर एक पहचानकर्ता है,
  • A.B मतलब है Bstruct, class, या union प्रकार एक के एक सदस्य है जिसका उदाहरण ऑब्जेक्ट या संदर्भ A, और
  • 01 द्वारा संदर्भित किया गया है
  • A->B मतलब है Bstruct, class, या union प्रकार एक उदाहरण है जो की सूचक A से जाना जाता है का एक सदस्य है। (यह (*A).B के बराबर है।)

कुछ अन्य भाषाओं में, सभी तीन मामलों में केवल एक . से आते हैं।

ध्यान दें कि सी ++ में, सदस्य कार्य को उनकी कक्षा की परिभाषा के भीतर लागू (परिभाषित) करने की आवश्यकता नहीं है। (यदि वे हैं, तो वे निश्चित रूप से inline हैं।) वे अलग-अलग कार्यान्वयन (.cpp) फ़ाइलों में लागू और अक्सर लागू किए जा सकते हैं। इसका लाभ यह है कि जब आप कक्षा के सदस्य कार्यों में से किसी एक के कार्यान्वयन को बदलते हैं तो किसी वर्ग के सभी उपयोगकर्ताओं को पुन: संकलित करने की आवश्यकता नहीं होती है। तो जब तक weight_datanamespace नाम है, void weight_data::rev_seq(string &seq) {...} अपनी कक्षा के बाहर कक्षा के सदस्य की ऐसी परिभाषा है।

+1

जो बहुत व्यापक था, बहुत धन्यवाद! – ladyfafa

+2

नोट: '*' और '-> 'ऑपरेटरों को ओवरलोड किया जा सकता है। आम तौर पर वे केवल इटरेटर और स्मार्ट पॉइंटर्स जैसी चीज़ों के लिए अधिभारित होते हैं। यह संभव है कि खराब डिजाइन किए गए कोड इन ऑपरेटरों को अधिभारित कर देंगे। – Brian

+0

@ ब्रायन: यह एक बहुत अच्छा मुद्दा है! – sbi

0

लाइन void weight_data::rev_seq(string &seq) कंपाइलर को बताती है कि यह weight_data से rev_seq(string &seq) सदस्य फ़ंक्शन की परिभाषा है। अगर यह सिर्फ void rev_seq(string &seq) { ... } कहा गया है तो संकलक सोचेंगे कि weight_data वर्ग के rev_seq(string &seq) सदस्य फ़ंक्शन के विपरीत एक गैर-सदस्य फ़ंक्शन परिभाषित किया जा रहा था।

class weight_data 
{ 
    void rev_str(string &seq); 
} 

यह भी मतलब हो सकता है कि rev_str एक समारोह है कि नाम स्थान weight_data का हिस्सा है को दर्शाता है।

namespace weight_data 
{ 
    void rev_str(string &seq); 
} 
+1

ध्यान दें कि 'weight_data' नामस्थान हो सकता है। साथ ही, मुझे लगता है कि आप लिखना चाहते थे "अगर यह अभी कहा गया है 'शून्य rev_seq (स्ट्रिंग और seq) {...}' ... "। – sbi

+0

धन्यवाद मेरे आईबीआई में लाने के लिए एसबीआई। – joshu

0

बस के बारे में 2 और अधिक दिलचस्प बातें जोड़ने के बारे में सोचा ::

एक) ऑपरेटर :: है दोनों एक एकल और एक द्विआधारी ऑपरेटर

struct A{ 
    int m; 
}; 

int x; 
int main(){ 
    ::x;      // Unary 
    int (A::*p) = &A::m;  // Binary 
} 

ख) $ 10.3/12 - " स्कोप ऑपरेटर (5.1) के साथ स्पष्ट योग्यता वर्चुअल कॉल तंत्र को दबा देती है। "

struct A{ 
    virtual void f(){cout << 1;} 
}; 

struct B : A{ 
    void f(){cout << 2;} 
}; 

int x; 
int main(){ 
    B b; 
    A &ra = b; 
    ra.f();  // dynamic binding, prints 2 
    ra.A::f(); // suppress VF mechanism, prints 1. 
} 
संबंधित मुद्दे