2009-10-19 31 views
5

ठीक है, मैं बहुत अनुभवी सी ++ प्रोग्रामर नहीं हूं, लेकिन मैं सोच रहा था कि निम्नलिखित कन्स्ट्रक्टर के तर्कों में अंडरस्कोर का महत्व क्या है?सी ++ कन्स्ट्रक्टर में अग्रणी अंडरस्कोर का अर्थ क्या है?

class floatCoords 
{ 
public: 
    floatCoords(float _x, float _y, float _width, float _height) 
    : x(_x), y(_y), width(_width), height(_height) 
    { 

    } 
    float x, y, width, height; 
    ... 

उत्तर

8

यह सिर्फ एक सुविधाजनक नामकरण सम्मेलन है, इसका अर्थ भाषा के लिए कुछ भी नहीं है। बस सुनिश्चित करें कि आप इसे ऊपरी-केस अक्षर के साथ नहीं मानते हैं: What does double underscore (__const) mean in C?

+2

यह भी देखें: http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 –

+0

@ मार्टिन: धन्यवाद, मुझे आपकी पसंद है लिंक भी बेहतर है। –

+1

मैं अग्रणी अंडरस्कोर से पूरी तरह से बचता हूं इसलिए मुझे "ऊपरी-केस अक्षर का पालन न करें" बिट को समझाने/याद रखने की आवश्यकता नहीं है। –

1

वे केवल पैरामीटर के लिए नाम हैं। वे सदस्य चर से मेल खाते हैं और प्रारंभकर्ताओं के लिए उपयोग किए जाते हैं।

कोई विशेष अर्थ नहीं है - यह केवल एक सम्मेलन है जो कुछ लोग उपयोग कर सकते हैं।

9

कुछ खास नहीं है। उन्होंने इसे सदस्य चर और पैरामीटर नामों के बीच अंतर करने के लिए नाम दिया।

अंडरस्कोर सी ++ पहचानकर्ताओं में एक वैध चरित्र है।

+1

भी सामान्य रूप से सदस्य चर के अंडरस्को सम्मेलन द्वारा res और कन्स्ट्रक्टर तर्क नहीं है। हालांकि यह वास्तव में स्थानीय कोडिंग सम्मेलन तक है। कुछ दुकानों के सदस्यों के सामने "एम_" की आवश्यकता होती है। हालांकि डबल अंडरस्कोर से दूर रहें (कंपाइलर उपयोग के लिए आरक्षित)। देखें: http://stackoverflow.com/questions/1228161/why-use-prefixes-on-member-variables-in-c-classes – bluehavana

+3

मैंने यह कहने के लिए पर्याप्त कोड देखा है कि निजी सदस्यों के नाम पर कुछ भी नहीं, बहुत कम अंडरस्कोर, पारंपरिक हैं। – coppro

+2

यह भी ध्यान रखें कि यह अंतर एक सीटीओ-प्रारंभकर्ता में सख्ती से जरूरी नहीं है - सदस्यों के लिए नाम लुकअप केवल सदस्यों को पाता है, और प्रारंभकर्ता के अंदर नाम लुकअप पहले पैरामीटर नाम पाएगा। – coppro

0

उनके पास वाक्य रचनात्मक अर्थ नहीं है। हालांकि, यदि आपके पास फ़ील्ड का समूह है (उदा। x, y, width, और height), यह कन्स्ट्रक्टर पैरामीटर का नाम देने के लिए एक आम सम्मेलन है जो उन्हें फ़ील्ड नाम और एक अग्रणी अंडरस्कोर के साथ प्रारंभ करता है।

0

उन अंडरस्कोर का उद्देश्य पैरामीटर चर float _x और सदस्य चर float x को अलग करना है। संवैधानिक रूप से, अंडरस्कोर के कारण कोई विशेष अर्थ जोड़ा नहीं गया है। मैं व्यक्तिगत रूप से a_ के साथ सभी पैरामीटर को उपसर्ग करना पसंद करता हूं और जब मुझे C++ कोड करना होता है तो m_ के साथ सभी सदस्य चर को उपसर्ग करना पसंद करते हैं।

तो जब मैं ऐसी परिस्थिति में जाता हूं जहां मुझे स्थानीय, सदस्य और पैरामीटर चर का मिश्रण और मिलान करना होता है, तो मुझे पता है कि मैं किसके साथ काम कर रहा हूं।

int y = a_x * 2; 
m_x = y + 3; 
8

अधिकतर, कोड का लेखक प्रारंभकर्ता सूची में डेटा सदस्य नामों और कन्स्ट्रक्टर पैरामीटर नामों के बीच संभावित संघर्ष से बचने की कोशिश कर रहा था। काफी संभावना है, लेखक इस तथ्य से अवगत नहीं थे कि सी ++ लुकअप नियम यह सुनिश्चित करते हैं कि संघर्ष वैसे भी नहीं होगा। अर्थात। निम्नलिखित कोड भी अपेक्षित परिणाम

class floatCoords { 
    public: 
     floatCoords(float x, float y, float width, float height) 
       : x(x), y(y), width(width), height(height) 
     { 
     } 
     float x, y, width, height; 
     ... 

हालांकि यह एक तैयार किए गए पाठक के लिए भ्रमित साबित हो सकता है।

बेशक, कन्स्ट्रक्टर के शरीर के अंदर, पैरामीटर नाम सदस्य नाम छुपाएंगे, इस प्रकार डेटा सदस्यों तक पहुंचने के लिए this->... या योग्य नामों का उपयोग करना आवश्यक हो जाएगा। संभावना है कि कोड का लेखक भी इससे बचने की कोशिश कर रहा था।

+0

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

+0

@ThisSuitIsBlackNot: जरूरी नहीं है। 'यह-> सदस्य' वाक्यविन्यास चलिए आप अपने 'setX' और' setY' विधियों को लागू करते हैं भले ही पैरामीटर नाम सदस्य नाम छुपाएं। कुछ कोडिंग मानकों के लिए वास्तव में आवश्यकता होती है कि वर्ग के सदस्यों को हमेशा 'इस-> सदस्य' वाक्यविन्यास के माध्यम से उपयोग किया जाता है (इसमें कुछ मूल्य है, मुझे प्रवेश करना है)। – AnT

+0

@AndreyT: आप एक अच्छा मुद्दा बनाते हैं। यदि लगातार उपयोग किया जाता है, तो यह-> सदस्य वाक्यविन्यास बहुत स्पष्ट है (मैंने इस प्रारूप को कई जावा क्लास में देखा है)। हालांकि, जब आप "यह->" भाग भूल जाते हैं तो क्या होता है? मुझे यकीन नहीं है कि व्यवहार क्या है, लेकिन मुझे लगता है कि यह अक्सर बड़ी परियोजनाओं पर होता है। यहां तक ​​कि यदि कुछ भी डरावना नहीं होता है, तो कोड में असंगतता मुझे परेशान करेगी (मैं यहां एक नाइट चुन रहा हूं)। – ThisSuitIsBlackNot

0

क्योंकि यदि आप डेन फ्लोट एक्स, फ्लोट वाई आदि नाम देंगे तो आप कक्षा के वास्तविक क्षेत्रों तक नहीं पहुंच पाएंगे क्योंकि उनके पास समान नाम है।

यह भाषा के साथ कोई संबंध नहीं है, यह (कोड और अधिक स्पष्ट बनाने के लिए, मुझे लगता है)

2

ये सिर्फ चर नामकरण की परंपरा है कि अलग अलग लोगों/संस्थाओं मान रहे हैं वास्तविक प्रोग्रामर द्वारा सिर्फ एक सम्मेलन है। यह पहली नजर में अनावश्यक प्रतीत हो सकता है लेकिन कोड पढ़ने और लिखने पर वास्तव में बहुत उपयोगी होता है, खासकर जब आपके पास पैरामीटर और सदस्य चर होते हैं जिनका नाम समान होता है। जैसे

class A { 
    void foo(int age_) { //parameter 
    int age = 18; //local scope 
    if (age_ > age) cout << legal << endl; 
    } 
    int _age; //member 
}; 

ऊपर के उदाहरण में: आप आमतौर पर इन तीन मामलों में हो सकता है

  • _variable - यह एक वर्ग के सदस्य चर
  • variable_ है का मतलब है - इसका मतलब है एक समारोह के लिए एक पैरामीटर है
  • वैरिएबल - इसका मतलब यह है कि यह फ़ंक्शन स्कोप
+0

और _ लागू करने योग्य नामस्थान पर _ tariable tresspasses। –

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