2009-12-26 14 views
5

मैं फिलहाल सी ++ सीख रहा हूं, सी ++ प्राइमर प्लस। लेकिन मुझे बस cplusplus वेबसाइट की जांच करने और फ़ाइल हैंडलिंग के लिए थोड़ा आगे छोड़ने की तरह लग रहा था।'ब्रैकेट प्रारंभ करना'। (सी ++)

मैं जावा, PHP, दृश्य मूल से आने वाली फ़ाइल हैंडलिंग की मूल बातें जानता हूं। लेकिन मैं एक सुंदर अजीब रेखा में आया था।

ostream os(&fb); 

एफबी एक फ़ाइलबफ का प्रतिनिधित्व करता है। मैं सिर्फ यह की वाक्य रचना नहीं मिलता है, लेकिन मैं यह पता लगाने सकता है कि यह रूप में एक ही है:

ostream os = &fb; 

लेकिन मैं वास्तव में चर आरंभ की इस तरह के बारे में कभी नहीं पढ़ा।

तो मैं सोच रहा हूं। क्या मैं सिर्फ मूर्ख हूं और पूरे समय एक वास्तविक उपयोगी सुविधा खो रहा हूं? क्या यह पुराना शुरू करने का तरीका है? क्या यह कुछ अलग है?

अग्रिम धन्यवाद।

उत्तर

5

शायद आप this और this

+0

इस महान संदर्भ और त्वरित उत्तर के लिए धन्यवाद :) –

+5

आपको इस पोस्ट में, यहां जवाब देना चाहिए। लिंक तब हो सकता है जब किसी और को इस प्रश्न का उत्तर देने की आवश्यकता हो, और हे, अगर आप प्रतिनिधि चाहते हैं, तो आपको वास्तविक उत्तर पोस्ट करना चाहिए। यह सामान्य एसओ सौजन्य है। – jalf

+0

दूसरे लिंक से हल्के ढंग से paraphrased: 'ostream os = &fb;' प्रारंभिक प्रतिलिपि है, और 'os' हमेशा 'ostream' की प्रतिलिपि ctor का उपयोग करके प्रारंभ किया जाता है। ("=" सी से सिर्फ एक वाक्यविन्यास धारक है; ऑपरेटर = कभी नहीं कहा जाता है।) इस तरह की स्थिति में कॉपी निर्माण को अनुकूलित करने के लिए संकलक वास्तव में अनुमति (लेकिन आवश्यक नहीं) है। यदि यह इसे अनुकूलित करता है, तो प्रतिलिपि ctor अभी भी सुलभ होना चाहिए। ** दिशानिर्देश: ** 'ostream os (& fb)' फ़ॉर्म का उपयोग करना पसंद करते हैं। यह हमेशा काम करता है जहां 'ostream os = & fb' काम करता है, और इसमें अन्य फायदे हैं (उदाहरण के लिए, यह एकाधिक पैरामीटर ले सकता है)। –

5

एक छोटा सा कार्यक्रम पढ़ना चाहिए देखने के लिए जब प्रतिलिपि निर्माता कहा जाता है और अतिभारित असाइनमेंट ऑपरेटर समारोह कहा जाता है जब:

#include <iostream> 

using namespace std; 

class test 
{ 
    public: 
     // default constructor. 
     test() 
     { 
      cout<<"Default Ctor called"<<endl; 
     } 

     // copy constructor. 
     test(const test& other) 
     { 
      cout<<"Copy Ctor called"<<endl; 
     } 

     // overloaded assignment operator function. 
     test& operator=(const test& other) 
     { 
      cout<<"Overload operator function called"<<endl; 
      return *this; 
     } 
}; 

int main(void) 
{ 
    test obj1; // default constructor called. 

    test obj2 = obj1; // copy constructor called. 

    test obj3(obj2); // again copy constructor called. 

    obj1 = obj2; // overloaded assignment operator function. 

    return 0; 
} 

आउटपुट:

Default Ctor called 
Copy Ctor called 
Copy Ctor called 
Overload operator function called 

तो आपके मामले में, ओस्ट्रीम की कॉपी कन्स्ट्रक्टर दोनों अवसरों में बुलाया जाता है।

+0

लगता है कि मैं बहुत सही था तो: डी। स्पष्ट स्पष्टीकरण के लिए धन्यवाद। छुट्टियां आनंददायक हों! –

6

दोनों फॉर्म प्रारंभिक प्रदर्शन करते हैं। पहला वाक्यविन्यास (() के साथ) को प्रत्यक्ष-प्रारंभिक वाक्यविन्यास कहा जाता है। दूसरा वाक्यविन्यास (= के साथ) को प्रति-प्रारंभिक वाक्यविन्यास कहा जाता है। वे वास्तविक जीवन के मामलों में भी कार्य करेंगे, लेकिन दोनों के बीच वास्तव में अंतर हैं।

परिस्थितियों में जब बाएं हाथ की ओर (एलएचएस) और दाएं हाथ की तरफ (आरएचएस) के प्रकार समान हैं (किसी भी कॉन्स/अस्थिर क्वालीफायर को अनदेखा कर रहे हैं), दोनों वास्तव में वही हैं। भाषा मानक स्पष्ट रूप से बताता है कि इस मामले में = फॉर्म () फ़ॉर्म के बराबर है।

लेकिन जब प्रकार अलग होते हैं (और एलएचएस प्रकार एक वर्ग प्रकार है), तो ये दो रूप आम तौर पर अलग-अलग काम करेंगे।

  • कॉपी-आरंभीकरण रूप से काम करता है इस प्रकार है: (: मानक रूपांतरण, रूपांतरण ऑपरेटर, रूपांतरण निर्माता किसी भी संभव तरह से) एलएचएस प्रकार के अस्थायी वस्तु के लिए आरएचएस मूल्य कन्वर्ट। और फिर एलएचएस ऑब्जेक्ट में अस्थायी ऑब्जेक्ट की प्रतिलिपि बनाने के लिए एलएचएस कक्षा की कॉपी कन्स्ट्रक्टर का उपयोग करें।

  • प्रत्यक्ष प्रारंभिक रूप निम्नानुसार काम करता है: बस एलएचएस के सभी रचनाकारों पर विचार करें और ओवरलोड रिज़ॉल्यूशन का उपयोग करके सबसे उपयुक्त चुनें।

आप तुरंत देख सकते हैं कि कॉपी-प्रारंभ वाक्य रचना बिना शर्त प्रति निर्माता का उपयोग करता है (कॉपी और मध्यवर्ती अस्थायी दूर अनुकूलित किया जा सकता है, लेकिन धारणात्मक वे देखते हैं)।यदि एलएचएस कक्षा में कोई सुलभ प्रति-कन्स्ट्रक्टर नहीं है, तो प्रति-प्रारंभिकरण बिना शर्त रूप से बीमार हो जाता है, जबकि प्रत्यक्ष-प्रारंभिक कार्य अभी भी काम कर सकता है।

इसके अलावा, कुछ कन्स्ट्रक्टर पर लागू कीवर्ड explicit प्रभावित करेगा कि किस प्रकार के प्रारंभिक प्रकार उपलब्ध हैं जिसके लिए प्रकारों के संयोजन हैं।

+1

बस उस * बिल्कुल * शब्द को चुनने जा रहा है (चूंकि उत्तर लगता है कि यह वास्तव में मानक के उत्तर के लिए जा रहा है): यदि प्रतिलिपि निर्माता स्पष्ट है, तो एलएचआर और आरएचएस मामले में '=' वाक्यविन्यास विफल हो जाएगा टाइप करें, जबकि '()' फॉर्म विफल नहीं होगा। –

0

मेरी समझ से, & var var चर के लिए एक उपनाम है और इससे कोई फर्क नहीं पड़ता कि आप किस का उपयोग करते हैं।

-------- अलावा -----------------

नीचे कोड यह इसकी स्पष्ट है कि दोनों हैं Stroustrup book.From से लिया जाता है एक ही चर के लिए उपनाम। यह नीचे जैसा भी कहता है।

"तर्क गुजरने के अर्थशास्त्र को प्रारंभिकरण के रूप में परिभाषित किया गया है, इसलिए जब कहा जाता है, वृद्धि की तर्क aa x का एक और नाम बन गया।" मैं x12 के उपनाम होने के लिए & x पर क्यों गया था। समारोह-कॉल प्रारंभ की

void increment(int& aa) { aa++; }

void f() { int x = 1; increment(x); }

+0

नहीं, 'और var'' var' का पता है। उनके पास विभिन्न प्रकार हैं; यदि var टाइप टी है, तो और var टाइप टी * है। –

+0

मैंने अपना जवाब संपादित किया। कृपया यह जाँचें। – Boolean

1

एक महत्वपूर्ण लाभ यह है कि वे भी कंस्ट्रक्टर्स कि कई तर्क ले के साथ काम है। उदाहरण के लिए, एक fstream निर्माता दो पैरामीटर ले जा सकते हैं:

std::fstream file("filename", ios_base::out); 

C++0x uniform initialization तक व्यापक रूप से उपलब्ध है, समारोह-कॉल प्रारंभ एक ही रास्ता कई तर्क कंस्ट्रक्टर्स को संभालने के लिए है।

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