सी / सी ++ संरचना बनाम कक्षा


108

मेरे C ++ वर्ग को समाप्त करने के बाद मुझे ऐसा लगा कि कुछ मामूली अंतरों को छोड़कर संरचना / वर्ग लगभग समान हैं।

मैंने पहले कभी सी में प्रोग्राम नहीं किया है; लेकिन मुझे पता है कि इसकी संरचनाएं हैं। सी में क्या अन्य संरचनाओं को विरासत में लेना और सार्वजनिक / निजी को संशोधित करना संभव है?

यदि आप नियमित C में ऐसा कर सकते हैं तो दुनिया में हमें C ++ की आवश्यकता क्यों है? क्या एक संरचना से अलग कक्षाएं बनाता है?

c++  class  struct 

संभव डुप्लिकेट stackoverflow.com/questions/54585/…
gonzobrains

जवाबों:


146

सी ++ में , संरचनाएं और कक्षाएं बहुत समान हैं; एकमात्र अंतर यह है कि जहां निजी के लिए डिफ़ॉल्ट रूप से एक्सेस मोडिफायर (सदस्य चर, विधियों और आधार वर्गों के लिए), सार्वजनिक रूप से डिफ़ॉल्ट में एक्सेस मॉडिफायर का उपयोग करते हैं।

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

हालांकि, उदाहरण के लिए, C- में कुछ OOP नकली होना संभव है, जो सभी को अपने पहले पैरामीटर के रूप में एक पॉइंटर पर ले जाते हैं, या कभी-कभी "सब / सुपरक्लास" होने के लिए समान पहले कुछ फ़ील्ड्स के साथ स्ट्रक्चर्स को समेटते हैं -यह हमेशा की तरह होता है पर बोल्ट किया गया, और वास्तव में भाषा का हिस्सा नहीं है।


OOP संभावित से .Net लोगों ने इसे इस तरह परिभाषित किया है ID CONSIDER एक वर्ग के बजाय एक संरचना को परिभाषित करता है यदि प्रकार के उदाहरण छोटे और आमतौर पर अल्पकालिक होते हैं या आमतौर पर अन्य वस्तुओं में एम्बेडेड होते हैं। X AVOID एक संरचना को परिभाषित करता है जब तक कि प्रकार में निम्नलिखित विशेषताएं न हों: 1. यह तार्किक रूप से आदिम प्रकार (इंट, डबल, आदि) के समान एकल मूल्य का प्रतिनिधित्व करता है। 2. यह 16 बाइट्स के तहत एक उदाहरण आकार है। 3. यह अपरिवर्तनीय है।
अभिजीत

5
@ अभिजीत सी # में स्ट्रक्चर्स और क्लासेस के बीच का अंतर है, लेकिन यह केवल सी ++ के लिए अप्रासंगिक है, और सी # में भी इतना ही है, क्लास और स्ट्रक्चर्स वास्तव में अलग-अलग हैं; C ++ में ऐसा नहीं है, और C में केवल OO के बिना स्ट्रक्चर्स हैं।
एंटाल स्पैक्टर-ज़बस्की

C ++ संरचना में समान C शब्दार्थ रखना बेहतर नहीं होगा? और जब एक "c ++ तरीके से संरचना" का उपयोग करने की आवश्यकता होती है तो बस एक वर्ग का उपयोग करें? मुझे C ++ की तुलना में C ++ में "संवर्धित" संरचना होने का लाभ कभी नहीं मिला। मुझे अभी भी संरचना का उपयोग करना पसंद है जहां सी में डिज़ाइन किया गया है, अन्यथा कुछ अपवाद के साथ एक वर्ग का उपयोग करें।
राफेलो

15

अन्य कि डिफ़ॉल्ट पहुंच (सार्वजनिक / निजी) में कोई अंतर नहीं है।

हालाँकि, कुछ दुकानें जो C और C ++ में कोड करती हैं, वे "क्लास / स्ट्रक्चर" का उपयोग करके यह संकेत देंगी कि C और C ++ (स्ट्रक्चर) में किसका उपयोग किया जा सकता है और जो केवल C (क्लास) हैं। दूसरे शब्दों में, इस शैली में सभी संरचनाओं को C और C ++ के साथ काम करना होगा। यह इस तरह का है कि पहले बहुत पहले अंतर था, जब सी ++ अभी भी "सी विद क्लासेस" के रूप में जाना जाता था।

ध्यान दें कि C यूनियन्स C ++ के साथ काम करते हैं, लेकिन दूसरे तरीके से नहीं। उदाहरण के लिए

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

और इसी तरह

typedef union friend{
    int a;
    float b;
} class;

केवल C में काम करता है


9
अपने c कोड में cpp कीवर्ड का उपयोग करना और फिर यह दावा करना कि यह cpp संगत नहीं है, बल्कि बेवकूफ है
Dani

7

मैं मौजूदा उत्तरों में जोड़ने जा रहा हूं क्योंकि आधुनिक सी ++ अब एक चीज है और इन जैसे सवालों के साथ मदद के लिए आधिकारिक कोर दिशानिर्देश बनाए गए हैं।

यहां दिशानिर्देशों से संबंधित एक अनुभाग है:

C.2: वर्ग का उपयोग करें यदि वर्ग में एक अपरिवर्तनीय है; यदि डेटा सदस्य स्वतंत्र रूप से भिन्न हो सकते हैं तो संरचना का उपयोग करें

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

यदि सभी डेटा सदस्य एक-दूसरे से स्वतंत्र रूप से भिन्न हो सकते हैं, तो कोई अपरिवर्तनीय संभव नहीं है।

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

प्रवर्तन

सभी डेटा निजी और सार्वजनिक सदस्यों के साथ कक्षाओं के लिए देखें।

दिए गए कोड उदाहरण:

struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

Classउदाहरण के लिए, एक दूसरे से प्राप्त या परस्पर संबंध रखने वाले सदस्यों के लिए अच्छी तरह से काम करना। वे तात्कालिकता पर विवेक की जाँच में भी मदद कर सकते हैं। Struct"डेटा के बैग" होने के लिए अच्छी तरह से काम करते हैं, जहां वास्तव में कुछ खास नहीं चल रहा है, लेकिन सदस्य तार्किक रूप से समझ में आते हैं।

इससे, यह समझ में आता है कि classएनकैप्सुलेशन और अन्य संबंधित कोडिंग अवधारणाओं का समर्थन करने के लिए मौजूद है, यह structबस के लिए बहुत उपयोगी नहीं हैं।


एक अन्य विचार पोर्टेबिलिटी है। structs सबसे पोर्टेबल हैं उनका उपयोग C या C ++ या आगे और पीछे किया जा सकता है। structउदाहरण के लिए, मॉड्यूल का उपयोग करके उन्हें पायथन में भी अनपैक किया जा सकता है । अपनी परियोजना प्राथमिकता अन्य भाषाओं, इंटरफेस या सिस्टम के साथ संगत किया जा रहा है, तो पसंद करते हैं structअधिक class। सख्ती से कार्यक्रम-आंतरिक मामलों के लिए, पसंद करें class
डेव

6

C में सदस्य कार्यों को परिभाषित करना या एक दूसरे से संरचना प्राप्त करना संभव नहीं है।

इसके अलावा, C ++ केवल C + "व्युत्पन्न संरचनाएं" नहीं है। टेम्पलेट, संदर्भ, उपयोगकर्ता परिभाषित नामस्थान और ऑपरेटर ओवरलोडिंग सभी सी में मौजूद नहीं हैं।


मुझे पता है कि टेम्प्लेट आदि C में मौजूद नहीं हैं, लेकिन मुझे C powerमें स्ट्रक्चर्स के बारे में जानकारी नहीं थी । तो C ++ केवल स्ट्रक्चर्स का उपयोग सी के साथ संगत करने के लिए करता है?

4
सिर्फ पीछे की संगतता के लिए? व्यावहारिक आधार पर, शायद ऐसा कुछ है, लेकिन भेद इरादे का संकेत हो सकता है: जहां मैं एक structI का उपयोग करता हूं, जिसका अर्थ है बड़े पैमाने पर निष्क्रिय POD प्रकार की चीज़।
dmckee --- पूर्व-मध्यस्थ ने

@dmckee: इसके लायक क्या है, अधिकांश एसटीएल फंक्शनलर्स (यानी std::less) को कक्षाओं के रूप में परिभाषित किया जाता है।
बिली ओनली

1
सी ++ के साथ संगत सी + + पूरी तरह से बैकवर्ड नहीं है। आप कह सकते हैं कि स्ट्रक्चर कीवर्ड सी डेवलपर्स के लिए एक आवास है। मुझे उन कक्षाओं के लिए संरचनात्मक कीवर्ड पसंद है जो केवल एक ऑर्डर किए गए फैशन में डेटा रखते हैं, लेकिन स्वयं को (बहुत) तर्क प्रदान नहीं करते हैं।
ypnos

@ypnos: मेरी अंतिम टिप्पणी देखें। दोनों के बीच एकमात्र अंतर यह है कि एक के सदस्य डिफ़ॉल्ट सार्वजनिक हैं, और दूसरे डिफ़ॉल्ट निजी हैं।
बिली ओनली

3

C ++ में एक और अंतर, जब आप किसी एक्सेस स्पेसियर के बिना स्ट्रक्चर से क्लास इनहेरिट करते हैं, तो यह पब्लिक इनहेरिटेंस बन जाता है, जहां क्लास के मामले में यह प्राइवेट इनहेरिटेंस है।


1

C ++ मुख्य रूप से 1 के लिए स्ट्रक्चर्स का उपयोग करता है) C और 2 के साथ पीछे की ओर) POD प्रकार। सी संरचनाओं में विधियां, विरासत या दृश्यता नहीं है।


2
इसकी कीमत क्या है, इसके लिए अधिकांश एसटीएल फंक्शनलर्स (यानी std::less) को कक्षाओं के रूप में परिभाषित किया गया है।
बिली ओनली

3
ध्यान दें कि C ++ स्ट्रक्चर्स में विधियाँ, विरासत और दृश्यता हैं।
रॉबर्ट 18

c संरचना में फ़ंक्शन पॉइंटर शामिल हो सकता है हालांकि प्रकार (* एड्र) (params);
एरर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.