2011-02-09 23 views
6

सी ++ में '&' का अर्थ क्या है? समारोहसी ++ में '&' का क्या अर्थ है?

void Read_wav::read_wav(const string &filename) 
{ 

} 

और क्या है के भीतर के रूप में यह सी में बराबर है?

धन्यवाद


संपादित करें 1

मैं एक सी समारोह में ऊपर सी ++ समारोह को बदलने के लिए चाहते हैं, तो मैं इसे कैसे करना होगा?

+1

http://en.wikipedia.org समान है/विकी/संदर्भ_ (सी% 2 बी% 2 बी) –

+1

@Tim Medora के रूप में http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29 (लेकिन मैंने लिंक को सही किया है;)) –

+0

@ हर्नान एशे - पेस्ट मेरे हिस्से पर असफल ... धन्यवाद! –

उत्तर

12

इस संदर्भ में एक संदर्भ है, & चर एक संदर्भ बनाता है।

आमतौर पर, जब आप किसी फ़ंक्शन में एक चर को पास करते हैं, तो चर की प्रतिलिपि बनाई जाती है और फ़ंक्शन प्रतिलिपि पर काम करता है। जब फ़ंक्शन वापस आता है, तो आपका मूल चर अपरिवर्तित होता है। जब आप कोई संदर्भ पास करते हैं, तो कोई प्रतिलिपि नहीं बनाई जाती है और फ़ंक्शन द्वारा किए गए परिवर्तन फ़ंक्शन रिटर्न के बाद भी दिखाई देते हैं।

सी संदर्भ नहीं है, लेकिन एक सी ++ संदर्भ कार्यात्मक सी में सूचक के रूप में एक ही है सच में फर्क सिर्फ इतना संकेत दिए गए हैं जब आप उन्हें इस्तेमाल dereferenced किया जाना है वह यह है कि:

*filename = "file.wav"; 

लेकिन संदर्भ इस्तेमाल किया जा सकता है जैसे कि वे मूल चर थे:

filename = "file.wav"; 

प्रत्यक्ष तौर पर, संदर्भ कभी नहीं अशक्त होने की अपेक्षा की जाती है, हालांकि यह असंभव नहीं है कि ऐसा करने के लिए।

बराबर सी समारोह होगा:

 void read_wav(const char* filename) 
    { 

    } 

इसका कारण यह है सी string जरूरत नहीं है। सी में सामान्य अभ्यास एक स्ट्रिंग की आवश्यकता होने पर वर्णों की एक सरणी में पॉइंटर भेजना है। सी ++ में रूप में, आप एक स्ट्रिंग निरंतर

read_wav("file.wav"); 

प्रकार const char* है टाइप करता है, तो।

11

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

सी में एक स्ट्रिंग प्रतिनिधित्व करने के लिए विशिष्ट तरीका एक char सूचक द्वारा है, इसलिए समारोह की संभावना इस प्रकार दिखाई देगा:

void read_wav(struct Read_wav* instance, const char *filename) 
{ 
} 

नोट: पहला तर्क यहाँ निहित this वस्तु संदर्भ आप के लिए होता है simulates सी ++ में, क्योंकि यह सदस्य विधि की तरह दिखता है।

+0

क्या आप निश्चित हैं?! – karlphillip

+0

कृपया मेरा पहला संपादन देखें। धन्यवाद :) –

+1

आपको मूल संरचना के संदर्भ के साथ-साथ उपयोग के आधार पर संदर्भ की आवश्यकता है, Read_wav कक्षा से आंतरिक का उपयोग किया जा रहा है –

-3

& फ़ाइल नाम का मतलब है इस फ़ाइल नाम के

+1

सी में संदर्भ नहीं है। – unwind

+0

सी में संदर्भ के रूप में ऐसी कोई चीज नहीं है। यह कोड सी –

0

& का अर्थ है कि चर संदर्भ के माध्यम से पारित किया जाता है। तो, आपके फ़ंक्शन के अंदर आपके पास चर की स्थानीय प्रति नहीं होगी, लेकिन मूल चर स्वयं ही होगी। फ़ंक्शन के अंदर चर में सभी परिवर्तन मूल उत्तीर्ण चर को प्रभावित करेंगे।

+0

में संकलित नहीं है, यह सच है लेकिन उसके मामले में एक कॉन्स्ट-क्वालीफायर है, तो वैरिएबल बदल नहीं जाएगा – Nikko

0

आप Binky Pointer fun देख सकते हैं, यह एक ऐसा वीडियो है जो बताता है कि पॉइंटर्स और संदर्भ क्या हैं।

1

सी में, आप इसे इस तरह से लिखना होगा:

void read_wav(struct Read_wav* , const char * pSzFileName) 
{ 

} 

std :: स्ट्रिंग सी ++ स्थिरांक चार की सरणी से निपटने का तरीका है।

& एक सी ++ संदर्भ है। यह व्यवहार करता है जैसे कि आप पॉइंटर को पीछे रखते थे (यह मुख्य रूप से एक वाक्य रचनात्मक चीनी है, सोचा था कि यह अनुबंध को संकेत देता है कि पॉइंटर पीछे नहीं होना चाहिए)।

+2

आप इसे केवल लिखेंगे इस तरह अगर यह 'स्थिर 'था। गैर-स्थैतिक सदस्य फ़ंक्शन को स्पष्ट रूप से '_' से C++ से प्रतिस्थापित करने के लिए एक स्पष्ट 'Read_wav *' तर्क की आवश्यकता होगी। – dan04

+0

आप सही हैं। मैं संपादित करता हूँ –

0

इस मामले में, string &filename का अर्थ है कि फ़ंक्शन को एक प्रतिलिपि के रूप में प्राप्त करने के बजाय पैरामीटर के रूप में एक संदर्भ (एक स्मृति पता) प्राप्त होगा।

इस विधि का लाभ यह है कि आपका फ़ंक्शन फ़ाइल नाम में मौजूद डेटा को सहेजने के लिए स्टैक पर अधिक स्थान आवंटित नहीं करेगा।

0

यह एक संदर्भ है, जैसा कि अन्य ने कहा है। सी में, आप शायद की तरह

void read_wav(struct Read_wav* rw, const char* filename) 
{ 

} 
+0

'कॉन्स्ट चार * फ़ाइल नाम ' –

+1

@ फ़ू बह: या यहां तक ​​कि' कॉन्स्ट char * const filename' :) – GrahamS

1

कुछ के रूप में कार्य लिखते हैं एम्परसेंड C++ दो अलग अलग अर्थ में प्रयोग किया जाता है: (क चर या एक समारोह के जैसे) कुछ के पते प्राप्त करने और एक चर को निर्दिष्ट या फ़ंक्शन पैरामीटर कहीं और परिभाषित इकाई के संदर्भ के लिए। आपके उदाहरण में, बाद का अर्थ उपयोग में है।

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

उदा। देखें सी ++ में संदर्भों के बारे में अधिक जानकारी के लिए http://www.cprogramming.com/tutorial/references.html, What are the differences between a pointer variable and a reference variable in C++? या http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29

1

इस विशेष मामले में, std :: string में एक c_str विधि है जो एक कॉन्स char * देता है। आप एक समानांतर सी संस्करण बनाने और फिर अपने सी की तरह कुछ करना ++ हो सकता है: जहां do_read_wav अपने सी दिनचर्या है और internal_read_wav एक सी शैली struct के लिए सूचक है

void Read_wav::read_wav(const string &filename) 
{ 
    do_read_wav(internal_read_wav, filename.c_str()); 
} 

void do_read_wav(struct Read_wav rw, const char * filename) 

अब, आप कक्षा में जानकारी भंडारण कर रहे हैं, तो आप एक सी struct बनाने की जरूरत है [क्षेत्रों के सभी पॉड होना चाहिए, आदि]

1

संदर्भ उपनाम कर रहे हैं, वे बहुत ही संकेत के समान हैं ।

std::string एक स्पष्ट length साथ char की एक सरणी (जो है, वहाँ शून्य के रूप में एम्बेडेड वर्ण हो सकते हैं) है।

(यानी, एक encapsulated इंटरफेस प्रदान) अनुकरण करने के लिए एक सी-लाइब्रेरी है bstringBetter String Library के लिए। यह आपको दो विशिष्ट चर (सरणी और लंबाई) से निपटने के टेडियम से राहत देता है।

आप C में कक्षाओं का उपयोग नहीं कर सकते हैं, लेकिन आप उन्हें अग्रेषित संरचना (encapsulation लगाने के लिए) के साथ अनुकरण कर सकते हैं और कक्षा विधियों को एक स्पष्ट पैरामीटर के साथ नियमित रूप से नियमित कार्य बन जाते हैं।

कुल मिलाकर, इस निम्नलिखित परिवर्तन की ओर जाता है:

void Read_wav::read_wav(const string &filename); 

void read_wav(struct Read_wav* this, struct bstring const* filename); 

कौन सा (अलग struct शोर से) बहुत क्या आप :) पहले था करने के लिए

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