C ++ में संरचना और वर्ग के बीच अंतर क्या हैं?


441

यह प्रश्न पहले ही C # / नेट के संदर्भ में पूछा गया था ।

अब मैं C ++ में एक संरचना और एक वर्ग के बीच अंतर सीखना चाहूंगा। कृपया ओओ डिजाइन में एक या दूसरे को चुनने के कारणों के साथ-साथ तकनीकी अंतर पर चर्चा करें।

मैं एक स्पष्ट अंतर के साथ शुरू करूँगा:

  • यदि आप निर्दिष्ट नहीं करते हैं public:या private:, किसी संरचना के सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं; किसी वर्ग के सदस्य डिफ़ॉल्ट रूप से निजी हैं।

मुझे यकीन है कि C ++ विनिर्देशन के अस्पष्ट कोनों में पाए जाने वाले अन्य अंतर हैं।


6
यह लिंक अंतर को अच्छी तरह से बताता है।
sjsam

1
क्यों सभी लोग एक पेड़ बनाने के लिए संरचना का उपयोग करते हैं? क्योंकि ऐसा लगता है कि अंतर उतना नहीं है। BTW, यह एक महान वेबसाइट है। @ sjsam
JW.ZG

1
structC और C ++ के बीच अंतर की तलाश है ? यहाँ देखें
मार्क.2377 19

@ JW.ZG "नहीं" सभी लोग करते हैं! जो लोग ऐसा करते हैं वे या तो पसंद करते हैं, या structसी ++ में क्या मतलब है इसका एहसास नहीं करते हैं । ;) लेकिन कोई कारण नहीं है कि आप classइसके बजाय कीवर्ड का उपयोग नहीं कर सकते ।
ऑर्बिट

जवाबों:


466

आप वर्गों और संरचनाओं के बीच मुश्किल 2 अंतर को भूल जाते हैं।

मानक को उद्धृत करें ()11.2.2 C ++ 98 में C ++ 11 के माध्यम से):

बेस क्लास के लिए एक्सेस- स्पेसियर की अनुपस्थिति में , पब्लिक को तब माना जाता है जब व्युत्पन्न वर्ग को संरचना घोषित किया जाता है और जब क्लास को क्लास घोषित किया जाता है तो निजी मान लिया जाता है ।

और सिर्फ पूर्णता के लिए, वर्ग और संरचना के बीच अधिक व्यापक रूप से ज्ञात अंतर (11.2) में परिभाषित किया गया है:

कीवर्ड वर्ग के साथ परिभाषित एक वर्ग के सदस्य डिफ़ॉल्ट रूप से निजी हैं । कीवर्ड संरचना या संघ के साथ परिभाषित एक वर्ग के सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं ।

अतिरिक्त अंतर: कीवर्ड classका उपयोग टेम्प्लेट मापदंडों को घोषित करने के लिए किया जा सकता है, जबकि structकीवर्ड का उपयोग नहीं किया जा सकता है।


22
यह वास्तव में एक दूसरा अंतर नहीं है, यह सिर्फ इतना है कि प्रश्न ने अंतर को अपूर्ण रूप से कहा है। उपयोग करते समय सभी उप-विषय डिफ़ॉल्ट रूप से निजी होते हैं class, डिफ़ॉल्ट रूप से सार्वजनिक होते हैं struct, और दोनों एक वर्ग प्रकार को परिभाषित करते हैं।
बेन् वायगेट

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

104
वास्तव में, असली मुश्किल के बीच का अंतर structऔर classहै कि बाद एक के स्थान पर इस्तेमाल किया जा सकता है typenameटेम्पलेट पैरामीटर घोषित करने के लिए, जबकि पूर्व नहीं कर सकते। :)
sbi

21
@MrUniverse: यह सरासर गलत है। (एक स्कूल है जो एक सम्मेलन के लिए इसका उपयोग करता है, लेकिन यह वाक्यविन्यास रूप से लागू नहीं है।)
sbi

3
@sbi "संरचना और वर्ग के बीच वास्तविक मुश्किल अंतर" - प्यारा, लेकिन सवाल एक संरचना और एक वर्ग के बीच अंतर के बारे में है , न कि उन मतभेदों के बारे में जहां कीवर्ड का उपयोग किया जा सकता है।
जिम बेल्टर

161

C ++ FAQ को उद्धृत करते हुए ,

[Difference. [] कीवर्ड संरचना और वर्ग के बीच क्या अंतर है?

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

संरचना और वर्ग अन्यथा कार्यात्मक रूप से समतुल्य हैं।

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


123

यह C ++ की उत्पत्ति और सी के साथ संगतता को याद रखने योग्य है।

सी में संरचनाएं हैं, इसकी कोई अवधारणा नहीं है, इसलिए सब कुछ सार्वजनिक है।

डिफ़ॉल्ट रूप से सार्वजनिक होना आमतौर पर एक वस्तु-उन्मुख दृष्टिकोण लेते समय एक बुरा विचार माना जाता है, इसलिए C का एक रूप बनाने में जो OOP के लिए अनुकूल है (आप O में C कर सकते हैं, लेकिन यह आपकी मदद नहीं करेगा) जो था C ++ में विचार (मूल रूप से "C With Classes"), यह डिफ़ॉल्ट रूप से सदस्यों को निजी बनाने के लिए समझ में आता है।

दूसरी ओर, अगर स्ट्रॉस्ट्रप ने शब्दार्थ को बदल दिया होता structताकि उसके सदस्य डिफ़ॉल्ट रूप से निजी होते, तो यह संगतता को तोड़ देता (यह अब मानक के रूप में अक्सर सही नहीं होता है, लेकिन सभी मान्य सी प्रोग्राम भी मान्य सी ++ प्रोग्राम थे। जिसका C ++ को एक पैर जमाने पर बड़ा असर पड़ा)।

इसलिए एक नया कीवर्ड, classबिल्कुल एक संरचना की तरह पेश किया गया था, लेकिन डिफ़ॉल्ट रूप से निजी।

यदि C ++ बिना किसी इतिहास के, खरोंच से आया होता, तो शायद यह केवल एक ऐसा कीवर्ड होता। यह भी संभवत: यह प्रभाव नहीं बना सकता है।

सामान्य तौर पर, लोग संरचना का उपयोग तब करेंगे जब वे कुछ ऐसा कर रहे हों जैसे कि C में किस प्रकार से संरचना का उपयोग किया जाता है; सार्वजनिक सदस्य, कोई रचनाकार (जब तक यह एक संघ में नहीं है, तब तक आप संरचना में निर्माता हो सकते हैं, जैसे कि कक्षाओं के साथ, लेकिन लोग नहीं करते हैं), कोई आभासी तरीके आदि नहीं हैं, क्योंकि भाषाएं संवाद करने के लिए उतनी ही हैं। मशीन को निर्देश देने के रूप में कोड को पढ़ने वाले लोग (या हम असेंबली और कच्चे वीएम ऑपकोड के साथ चिपक जाते हैं) यह उस के साथ रहना एक अच्छा विचार है।


यह शायद यह भी ध्यान देने योग्य है कि शायद वर्गों और संरचनाओं को हुड के नीचे काम करना आसान था, उनकी तुलना में उन्हें मौलिक रूप से अलग होना चाहिए। रेट्रोस्पेक्ट में कुछ लाभ हो सकता है जैसे कि यह निर्दिष्ट करना कि एक संरचना के रूप में घोषित कुछ भी PODS होना चाहिए (अर्थात आभासी सदस्य, गैर-तुच्छ डिफ़ॉल्ट निर्माता या विध्वंसक, आदि से संरचना को रोकना) - ऐसी कोई बात मेरी जानकारी में नहीं है कभी भी किसी भी C ++ मानक और न ही कार्यान्वयन द्वारा आवश्यक है।
सुपरकैट

1
@supercat तथ्य यह है कि यह एक OO भाषा थी जिसमें एक गैर-OO भाषा में लिखे गए कार्यक्रमों का एक विशाल प्रदर्शन मान्य कार्यक्रम थे, इस अवधारणा को सामने लाया, और यह अधिक शुद्ध OO भाषाओं की तुलना में अधिक आने लगा। (और निश्चित रूप से वास्तव में मानक में परिभाषित किया गया है)। प्रारंभिक C ++ का इतिहास निश्चित रूप से इसके बारे में बहुत कुछ बताता है। स्ट्रॉस्ट्रुप की "द डिजाइन एंड एवोल्यूशन ऑफ सी ++" एक दिलचस्प रीड है।
जॉन हन्ना

1
मैं लोग हैं, जो कि सब कुछ जो "OOP-ish" नहीं है, होना चाहिए लग रहा है जो धार्मिक युद्ध मानता, और जो लोग सोचते हैं कि OOP के रूप में माना जाना चाहिए एक उपकरण है, लेकिन नहीं उपकरण। सी ++ निश्चित रूप से बाद के दर्शन को गले लगाता है, लेकिन मैं वास्तव में इससे पहले की भाषाओं के बारे में ज्यादा नहीं जानता। मेरा अपना दर्शन यह है कि जब कोई एक वस्तु चाहता है तो किसी वस्तु का उपयोग करना चाहिए, और जब कोई संबंधित लेकिन स्वतंत्र चर का एकत्रीकरण चाहता है, तो उस का उपयोग करना चाहिए। C ++ उन प्रकार की चीज़ों के बीच कोई वाक्यात्मक अंतर नहीं करता है, और .NET उस अंतर को धुंधला करने की कोशिश करता है, लेकिन मैं जिस डी के बारे में बहुत कम जानता हूं ...
सुपरकैट

1
... पता चलता है कि यह इसे C ++ या .NET की तुलना में moreso पहचानता है। चर के एकत्रीकरण बिल्कुल ओओपीश नहीं हैं, लेकिन इसका मतलब यह नहीं है कि जब वे उपयोगी होते हैं तो उन्हें नियोजित नहीं किया जाना चाहिए ।
सुपरैट

3
मैं असहमत हूं कि "C के पास संरचनाएं हैं, इसमें एनकैप्सुलेशन की कोई अवधारणा नहीं है, इसलिए सब कुछ सार्वजनिक है।", आप structअंदर की परिभाषा को छिपा सकते हैं *.c-File और अन्य अनुवाद इकाइयों को केवल एक पॉइंटर के साथ इसका उपयोग करने दें। तो आपके पास और भी मजबूत एनकैप्सुलेशन है, क्योंकि अन्य अनुवाद इकाइयों को भी नहीं पता है कि अंदर क्या है struct
12431234123412341234123

32

कक्षा के सदस्य डिफ़ॉल्ट रूप से निजी हैं। डिफ़ॉल्ट रूप से संरचना के सदस्य सार्वजनिक हैं। इसके अलावा कोई अन्य मतभेद नहीं हैं। यह प्रश्न भी देखें ।


15
केवल सदस्य ही नहीं, बल्कि विरासत सहित सभी पहुंच।
नागेज़ा ट्रिफ़ुनोविक

4
खैर, मैं कहूंगा कि दूसरा अंतर शब्दार्थ है। कई लोगों के लिए संरचना उन्हें सी से बचे हुए के रूप में "डेटा संरचना" के बारे में
सोचती है

3
@ क्रिसक्रुमर: वे "शब्दार्थ" नहीं हैं; वे व्यक्तिगत भावनाएं हैं। दोनों structऔर समान शब्दार्थ के साथ classएक वर्ग की घोषणा करते हैं (परिभाषा निकाय की पारे के अनुसार व्याख्या)।
ऑर्बिट

28

सी ++ प्रोग्रामिंग भाषा में स्ट्रॉस्ट्रुप के अनुसार :

आप किस शैली का उपयोग करते हैं, यह परिस्थितियों और स्वाद पर निर्भर करता है। मैं आमतौर structपर उन वर्गों के लिए उपयोग करना पसंद करता हूं, जिनके पास सभी डेटा सार्वजनिक हैं। मैं ऐसी कक्षाओं के बारे में सोचता हूं, "बहुत उचित प्रकार नहीं, सिर्फ डेटा संरचनाएं।"

कार्यात्मक रूप से, सार्वजनिक / निजी के अलावा कोई अंतर नहीं है


32
क्या अंतर है? कृपया समझाएँ।
क्रैशमास

10

STRUCT एक प्रकार का एब्सट्रैक्ट डेटा टाइप है जो स्ट्रक्चर स्पेसिफिकेशन के अनुसार मेमोरी के दिए गए चंक को विभाजित करता है। संरचनाएं विशेष रूप से फ़ाइल क्रमांकन / डीरिएलाइज़ेशन में उपयोगी होती हैं क्योंकि संरचना को अक्सर फ़ाइल वर्बेटिम को लिखा जा सकता है। (अर्थात संरचना के लिए एक संकेतक प्राप्त करें, कॉपी करने के लिए बाइट्स की संख्या की गणना करने के लिए SIZE मैक्रो का उपयोग करें, फिर डेटा को संरचना के अंदर या बाहर स्थानांतरित करें।)

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

वास्तव में, संरचनाएं डेटा के बारे में हैं, कक्षाएं कोड के बारे में हैं।

हालाँकि, आपको यह समझने की ज़रूरत है कि ये केवल सार हैं। ऐसी संरचनाएँ बनाना पूरी तरह से संभव है जो वर्गों और वर्गों की तरह दिखती हैं जो कि बहुत सी संरचनाएँ जैसी दिखती हैं। वास्तव में, जल्द से जल्द सी ++ कंपाइलर केवल प्री-कंपाइलर थे जो सी ++ कोड को सी में अनुवाद करते हैं। इस प्रकार ये अमूर्त तार्किक सोच के लिए एक लाभ हैं, जरूरी नहीं कि यह कंप्यूटर के लिए एक संपत्ति है।

इस तथ्य से परे कि प्रत्येक एक अलग प्रकार का अमूर्त है, वर्ग सी कोड नामकरण पहेली का समाधान प्रदान करते हैं। चूँकि आप एक ही नाम के साथ एक से अधिक कार्य नहीं कर सकते हैं, डेवलपर्स _ () के पैटर्न का पालन करते थे। उदाहरण के लिए mathlibextreme_max ()। एपीआई को कक्षाओं में समूहित करके, समान कार्यों (यहां हम उन्हें "विधियां" कहते हैं) को एक साथ समूहीकृत किया जा सकता है और अन्य वर्गों में विधियों के नामकरण से संरक्षित किया जा सकता है। इससे प्रोग्रामर अपने कोड को बेहतर तरीके से व्यवस्थित कर सकता है और कोड का पुन: उपयोग बढ़ा सकता है। सिद्धांत रूप में, कम से कम।


1
यह संरचना और वर्गों के बारे में सबसे गैर-स्पष्ट बात है। "संरचनाएं डेटा के बारे में हैं, कक्षाएं कोड के बारे में हैं" को फिर से परिभाषित किया जा सकता है क्योंकि "संरचनाएं डेटा के बारे में हैं, कक्षाएं डेटा, सुरक्षा और इस डेटा पर किए गए संचालन के बारे में हैं"
अरुण अरविंद

3
C ++ में स्ट्रक्चर बनाना संभव नहीं है। विरासत में मिले structकीवर्ड का उपयोग करके ही क्लास बनाना संभव है ।
ऑर्बिट

1
यह उत्तर C ++ के बारे में नहीं लगता है। C ++ में, structकक्षाओं को घोषित करता है ( public/ private/ protected, उत्तराधिकार, आदि सहित )।
मेलोपोमीन

कैसे सार सार हैं? किसी फ़ाइल में कच्ची संरचना लिखना सी में भी समस्याओं से भरा होता है (सामान्य समस्याओं में पैडिंग, एंडियननेस, विभिन्न शब्द आकार आदि शामिल हैं)। इस SIZEमैक्रो के बारे में आप क्या बात कर रहे हैं?
melpomene

10

1) एक वर्ग के सदस्य डिफ़ॉल्ट रूप से निजी होते हैं और संरचना के सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं।

उदाहरण के लिए प्रोग्राम 1 संकलन में विफल रहता है और प्रोग्राम 2 ठीक काम करता है।

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

2) जब किसी वर्ग / संरचना से एक संरचना प्राप्त की जाती है, तो आधार वर्ग / संरचना के लिए डिफ़ॉल्ट पहुंच-निर्दिष्ट सार्वजनिक होता है। और जब एक वर्ग प्राप्त होता है, तो डिफ़ॉल्ट पहुंच निर्दिष्ट निजी होती है।

उदाहरण के लिए प्रोग्राम 3 संकलन में विफल रहता है और प्रोग्राम 4 ठीक काम करता है।

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}

मैंने विशेषज्ञों द्वारा बताए गए कोड उदाहरण 3-7 को हटा दिया है
सूरज के थॉमस

8

केवल अन्य अंतर कक्षाओं और संरचनाओं का डिफ़ॉल्ट वंशानुक्रम है, जो, क्रमशः, निजी और सार्वजनिक है।


5
  1. किसी संरचना के सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं, वर्ग के सदस्य डिफ़ॉल्ट रूप से निजी होते हैं।
  2. किसी अन्य संरचना या वर्ग से संरचना के लिए डिफ़ॉल्ट वंशानुक्रम सार्वजनिक है। किसी अन्य संरचना या वर्ग से वर्ग के लिए निजी विरासत निजी है।
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

यह VS2005 पर है।


_tmainमानक C ++ नहीं है।
मेलपोमिन

4

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


4

एक और बात ध्यान दें, यदि आपने एक विरासत ऐप को अपडेट किया है जिसमें उन कक्षाओं का उपयोग करने के लिए संरचना थी जिन्हें आप निम्नलिखित मुद्दे पर चला सकते हैं:

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

जब वर्चुअल फ़ंक्शंस कक्षाओं में होते हैं, तब आंतरिक रूप से कंपाइलर फ़ंक्शंस को इंगित करने के लिए क्लास डेटा में अतिरिक्त पॉइंटर जोड़ देगा।

यह कैसे पुराने विरासत कोड को तोड़ देगा यदि पुराने कोड में कहीं संरचना मेम्फ़िल का उपयोग करके इसे सभी शून्य पर साफ़ करने के लिए साफ़ किया गया था, तो यह अतिरिक्त पॉइंटर डेटा को भी स्टंप करेगा।


1
कोड है कि एक संरचना को साफ करने के लिए मेम्फिल का उपयोग करता है शायद अन्य आक्रामक आदतें हैं। सावधानी से चलें।
डेविड थॉर्नले

@DavidThornley: मिटा करने के लिए एक शून्य को भरने का प्रयोग करें या प्रारंभ एक डेटा संरचना सी में मानक एक मिश्रित-भाषा परियोजना में है, एक सी भाग में कोड से बचने के लिए उम्मीद नहीं कर सकते callocकरने के पक्ष में new। सभी एक यह सुनिश्चित करने की कोशिश कर सकते हैं कि कोड के सी भाग द्वारा उपयोग की जाने वाली कोई भी संरचना वास्तव में PODS है।
सुपरकैट

4
  1. एक वर्ग खोजशब्द के साथ परिभाषित के सदस्य classहैं privateडिफ़ॉल्ट रूप से। कीवर्ड struct(या union) के साथ परिभाषित एक वर्ग के सदस्य publicडिफ़ॉल्ट रूप से हैं।

  2. बेस क्लास के लिए एक एक्सेस-स्पेसियर की अनुपस्थिति में, publicतब माना जाता है जब व्युत्पन्न वर्ग को घोषित किया जाता है structऔर privateजब क्लास घोषित किया जाता है तो यह मान लिया जाता है class

  3. आप घोषणा कर सकते हैं, enum classलेकिन नहीं enum struct

  4. आप उपयोग कर सकते हैं template<class T>लेकिन नहीं template<struct T>

यह भी ध्यान दें कि C ++ मानक आपको एक प्रकार को अग्रेषित-घोषित करने की अनुमति देता है struct, और फिर classटाइप करते समय और इसके विपरीत का उपयोग करें। इसके अलावा, std::is_class<Y>::valueहै trueवाई एक होने के लिए structऔर एक classहै, लेकिन है falseएक के लिए enum class


अच्छा जवाब, हालांकि मुझे एक स्पष्ट याद नहीं आ रहा है) 0 structऔर classc ++ के बीच का अंतर कीवर्ड के बीच का अंतर है, डेटा प्रकारों (या कुछ बेहतर विकल्प;) के बीच का अंतर नहीं है
idclev 463035818

@ पूर्ववार्ता_463035818: लेकिन क्या आपको नहीं लगता कि std::is_class<Y>::valueइसमें शामिल हैं?
बाथशीबा

हाँ, बस सोचा था कि यह अधिक प्रमुख हो सकता है, क्योंकि आम गलतफहमी है और एक बार जिस तरह से बाहर बाकी है बस corollaries है।
आइडलव्यू ४६३०३५18१

कोई बात नहीं, आपका जवाब सही है, मैंने एक और लिखा है, एक और चोट के लिए नहीं लिखा है
idclev 463035818

4

के बीच का अंतर classऔर structकीवर्ड के बीच, डेटा प्रकार के बीच नहीं एक अंतर है। यह दो

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

दोनों एक वर्ग प्रकार को परिभाषित करते हैं। इस संदर्भ में कीवर्ड का अंतर अलग-अलग डिफ़ॉल्ट एक्सेस है:

  • foo::xसार्वजनिक है और foo_baseसार्वजनिक रूप से विरासत में मिला है
  • bar::xनिजी है और bar_baseनिजी तौर पर विरासत में मिली है

2

यहाँ एक अच्छी व्याख्या है: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

इसलिए, एक और समय: C ++ में, एक संरचना एक वर्ग के समान है सिवाय इसके कि एक संरचना के सदस्यों में डिफ़ॉल्ट रूप से सार्वजनिक दृश्यता होती है, लेकिन एक वर्ग के सदस्यों में डिफ़ॉल्ट रूप से निजी दृश्यता होती है।


2

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


2

आईएसओ आईईसी 14882-2003

9 कक्षाएं

§3

एक संरचना वर्ग-कुंजी के साथ परिभाषित एक वर्ग है struct; इसके सदस्य और आधार वर्ग (खंड 10) डिफ़ॉल्ट रूप से सार्वजनिक होते हैं (खंड 11)।


2

एक और मुख्य अंतर यह है कि जब यह टेम्प्लेट की बात आती है। जहां तक ​​मुझे पता है, आप एक वर्ग का उपयोग कर सकते हैं जब आप एक टेम्पलेट को परिभाषित करते हैं, लेकिन एक संरचना नहीं।

template<class T> // OK
template<struct T> // ERROR, struct not allowed here

1
यदि आप इस बात पर जोर देना चाहते हैं कि संरचनाओं को सामान्यीकृत प्रकारों के रूप में उपयोग नहीं किया जा सकता है, तो आप गलत हैं। और structवहां केवल कन्वेंशन द्वारा अनुमति नहीं दी जाती है (बेहतर कहना है कि यह classकीवर्ड है जो यहां अलग-अलग अर्थों में उपयोग किया जाता है, टेम्प्लेट मापदंडों के लिए 'क्लास' या 'टाइपनेम' देखें )।
dma_k

वहां कीवर्ड की अनुमति नहीं है, लेकिन आप एक कक्षा में उत्तीर्ण हो सकते हैं जिसे आपने structठीक-ठीक परिभाषित किया है। बस इसे आज़माएं। struct T{}; template <typename T> void foo() {} foo<T>();
को ऑर्बिट में लाइटनेस दौड़

1

अन्य उत्तरों में निजी / सार्वजनिक चूक का उल्लेख किया गया है, (लेकिन ध्यान दें कि एक संरचना एक वर्ग है एक संरचना है; वे दो अलग-अलग आइटम नहीं हैं, एक ही आइटम को परिभाषित करने के सिर्फ दो तरीके हैं)।

ध्यान देने वाली बात हो सकती है (विशेषकर चूंकि पूछने वाला MSVC ++ का उपयोग करने की संभावना रखता है क्योंकि वह "अप्रबंधित" C ++) का उल्लेख करता है कि विजुअल C ++ कुछ परिस्थितियों में शिकायत करता है यदि एक वर्ग के साथ घोषित किया गया है classऔर तब struct(या संभवतः दूसरे तरीके से) ), हालांकि मानक कहता है कि पूरी तरह से कानूनी है।


मुझे पता है कि यह एक बहुत देर से टिप्पणी है, लेकिन ध्यान रखें कि उपरोक्त चेतावनी योग्यता के बिना नहीं है क्योंकि विंडोज़ एबीआई अलग-अलग तरीके से कक्षाएं और कक्षाएं लगाता है और इसलिए कक्षा और संरचना के मिश्रण (आगे) की घोषणाएं वास्तव में लिंकिंग समस्याओं को हल करने के लिए कठिन हो सकती हैं!
एमएफएच

1
  • । कक्षाओं में डिफ़ॉल्ट रूप से सभी सदस्य निजी होते हैं लेकिन संरचना में सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं।

    1. स्ट्रक्चर्स के लिए कंस्ट्रक्टर और डिस्ट्रक्टर जैसा कोई शब्द नहीं है, लेकिन यदि आप प्रदान नहीं करते हैं तो क्लास कंपाइलर डिफ़ॉल्ट बनाता है।

    2. Sizeof खाली संरचना 0 बाइट्स थी क्योंकि Sizeof खाली वर्ग 1 बाइट है। डिफ़ॉल्ट डिफ़ॉल्ट पहुंच प्रकार सार्वजनिक है। डेटा को समूहीकृत करने के लिए आमतौर पर एक संरचना का उपयोग किया जाना चाहिए।

    क्लास डिफ़ॉल्ट एक्सेस प्रकार निजी है, और इनहेरिटेंस के लिए डिफ़ॉल्ट मोड निजी है। डेटा और उस डेटा पर काम करने वाले तरीकों को समूहीकृत करने के लिए एक वर्ग का उपयोग किया जाना चाहिए।

    संक्षेप में, कन्वेंशन का उपयोग उस संरचना का उपयोग करना है जब उद्देश्य डेटा को समूहीकृत करना है, और कक्षाओं का उपयोग करना है जब हमें डेटा एब्स्ट्रक्शन और, शायद विरासत की आवश्यकता होती है।

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


3
2. "साइज़ोफ़ खाली संरचना है 0 बाइट्स थे क्योंकि साइज़ोफ़ खाली वर्ग 1 बाइट है"। असत्य। मैंने अभी-अभी परीक्षण किया है g++। आप खाली आधार अनुकूलन के बारे में सोच रहे होंगे, लेकिन यह दोनों पर भी लागू होता है।
cdunn2001

1
सच नहीं। C ++ में रिक्त संरचना का आकार 1. है। C में रिक्त संरचना की अनुमति नहीं है। GCC एक संकलक विस्तार के रूप में C में खाली संरचना की अनुमति देता है और इस तरह की संरचना का आकार 0. है
जोहान रोड

यह उत्तर गलत है। आकार की चीज़ के अलावा, कंस्ट्रक्टर / डिस्ट्रक्टर पार्ट भी गलत है: स्ट्रक्चर में कंस्ट्रक्टर और डिस्ट्रक्टर्स ठीक हो सकते हैं। वास्तव में, structC ++ में पूर्ण विकसित वर्ग बनाता है।
melpomene

1

अन्य उत्तरों द्वारा निहित करते समय, यह स्पष्ट रूप से उल्लेख नहीं किया गया है - कि संरचना सी संगत हैं, उपयोग के आधार पर; कक्षाएं नहीं हैं।

इसका मतलब है कि यदि आप एक ऐसा शीर्षक लिख रहे हैं, जिसे आप C संगत बनाना चाहते हैं, तो आपके पास संरचना के अलावा कोई विकल्प नहीं है (जो कि C दुनिया में कार्य नहीं कर सकते हैं; लेकिन फ़ंक्शन पॉइंटर्स हो सकते हैं)।


-1

जब आप संरचना या कक्षा में जाने के लिए दिशानिर्देशों के बारे में इस पर विचार कर सकते हैं, तो https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx

√ CONSIDER एक वर्ग के बजाय एक संरचना को परिभाषित करता है यदि प्रकार के उदाहरण छोटे और आमतौर पर अल्पकालिक होते हैं या आमतौर पर अन्य वस्तुओं में एम्बेडेड होते हैं।

एक्स AVOID एक संरचना को परिभाषित करता है जब तक कि प्रकार में निम्नलिखित विशेषताएं न हों:

यह तार्किक रूप से आदिम प्रकार (इंट, डबल, आदि) के समान एकल मूल्य का प्रतिनिधित्व करता है।

यह 16 बाइट्स के तहत एक उदाहरण आकार है।

यह अपरिवर्तनीय है।

इसे बार-बार बॉक्सिंग नहीं करना पड़ेगा।


यह .NET / C # के बारे में है, C ++ नहीं।
melpomene

-2

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

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

यदि आप कुछ सॉफ्टवेयर इंजीनियरिंग सिद्धांतों को पढ़ते हैं, तो आप पाएंगे कि अधिकांश मानकों को बिना कक्षा के आसानी से लागू नहीं किया जा सकता है। उदाहरण के लिए: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

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


यह उत्तर C ++ के बारे में नहीं लगता है। सी ++ में, structकक्षाओं की अनुमति देता है (अनुमति नियंत्रण, विरासत, आदि सहित)।
melpomene

-3

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


ओपी ने पहले ही उल्लेख किया है कि structसदस्य डिफ़ॉल्ट रूप से सार्वजनिक हैं, और 2009 के स्वीकृत उत्तर में विरासत का उल्लेख है। एक और उत्तर क्यों लिखें जो 4 साल बाद कोई नई जानकारी नहीं जोड़ता है?
melpomene

-3

इन सभी कारकों में से, यह निष्कर्ष निकाला जा सकता है कि अवधारणा क्लास "स्ट्रक्चर्स" के बजाय वास्तविक दुनिया की वस्तुओं का प्रतिनिधित्व करने के लिए अत्यधिक उपयुक्त है। हालांकि, क्योंकि क्लास में इस्तेमाल होने वाली ओओपी अवधारणाएं वास्तविक दुनिया के परिदृश्यों को समझाने में अत्यधिक व्यावहारिक हैं इसलिए उन्हें वास्तविकता में विलय करना आसान है। एक उदाहरण के लिए, डिफ़ॉल्ट वंशानुक्रम संरचना के लिए सार्वजनिक है, लेकिन अगर हम इस नियम को वास्तविक दुनिया के लिए लागू करते हैं, तो यह हास्यास्पद है। लेकिन एक वर्ग डिफ़ॉल्ट विरासत में निजी है जो अधिक यथार्थवादी है।

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


1
निजी विरासत "अधिक यथार्थवादी" कैसे है? अधिकांश प्रोग्रामिंग भाषाओं में निजी विरासत की अवधारणा भी नहीं है।
melpomene

-3

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


यह उत्तर C ++ के बारे में नहीं लगता है। C ++ में, structकक्षाओं को घोषित करता है ( public/ private/ protected, उत्तराधिकार, आदि सहित )।
melpomene

-3

** अद्यतन: ** कृपया इस उत्तर को अनदेखा करें। मैं इस संभावना पर विचार नहीं करता था कि संरचना के लिए, मूल्य अनैतिक था लेकिन सिर्फ 0. हुआ। संरचना और वर्ग के बीच कोई आरंभिक अंतर नहीं है।


मैं एक दूसरे को अलग-अलग देख रहा हूं, जो कि डिफॉल्ट इनिशियलाइजेशन के साथ करना है।

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

उस कोड को चलाएं और myTester की जांच करें। आपको पता चलेगा कि m_Foo के लिए, स्ट्रक्चर, m_Foo.a को 0 से इनिशियलाइज़ किया गया है, लेकिन m_Bar के लिए, क्लास, m_Bar.a uninitialized है। इसलिए डिफॉल्ट कंस्ट्रक्टर स्ट्रक्चर बनाम क्लास के लिए क्या करता है, इसमें अंतर दिखाई देता है। मैं इसे विजुअल स्टूडियो के साथ देख रहा हूं।


1
आपने कैसे निर्धारित किया कि m_Foo.aआरंभिक था? क्या होगा अगर यह असिंचित था और बस हुआ था 0?
melpomene

उह, मैंने नहीं किया। मेरी गलती। यह संरचना और वर्ग के बीच का अंतर नहीं है। प्रारंभिक विशेषताएं समान हैं।
एरिक हिल

-4

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

-> एक और आसान चीज जो मुझे कक्षा बनाम संरचना में मिलती है वह यह है कि किसी प्रोग्राम में फ़ाइलों को कार्यान्वित करते समय यदि आप किसी संरचना के कुछ संचालन को बार-बार करना चाहते हैं, तो ऑपरेशन के हर नए सेट पर आपको एक अलग फ़ंक्शन बनाने की आवश्यकता होती है और आपको इसकी आवश्यकता होती है फ़ाइल से पढ़ने के बाद संरचना का ऑब्जेक्ट पास करें ताकि उस पर कुछ संचालन किया जा सके। कक्षा में रहते हुए यदि आप एक ऐसा फंक्शन बनाते हैं, जो डेटा पर कुछ ऑपरेशंस को हर समय की जरूरत है.. तो आसान है कि आपको फ़ाइल से ऑब्जेक्ट को पढ़ना है और फ़ंक्शन को कॉल करना है ..

लेकिन यह प्रोग्रामर पर निर्भर करता है कि वह किस तरह से वह उपयुक्त पाता है ... मेरे अनुसार मैं क्लास एवरीटाइम को सिर्फ इसलिए पसंद करता हूं क्योंकि यह OOPs को सपोर्ट करता है और यही कारण है कि इसे लगभग हर भाषाओं में लागू किया जाता है और ऑल टाइम प्रोग्रामिंग की अद्भुत विशेषता है; - )

और हाँ सबसे अधूरा अंतर जो मैं उल्लेख करना भूल गया, वह यह है कि वर्ग डेटा छिपाने का समर्थन करता है और उन ऑपरेशनों का भी समर्थन करता है जो कि डेटा टाइप में निर्मित किए जाते हैं, जबकि स्ट्रक्चर नॉट!


1
C ++ structमें सदस्य कार्य हो सकते हैं
chtz

@ शट्ज थैंक्स ... मुझे अभी इस फीचर के बारे में पता चला है .. थैंक्स अ लॉट .. इम सिर्फ एक शुरुआत विशेषज्ञ के रूप में नहीं जैसा कि आप भविष्य में भी यू लोगों से सलाह की जरूरत है :-)
युग रावल

और वास्तव में, इसके व्यापक अर्थ में सदस्य कार्य करना है। structकंस्ट्रक्टर, सदस्य फ़ंक्शन और डिस्ट्रक्टर (संभवतः आभासी, संभवतः निजी, संरक्षित या सार्वजनिक) हो सकते हैं। वे विरासत में मिले और विरासत में मिले। तो वास्तव में ... सब कुछ एक वर्ग हो सकता है। एक टिपिकल कन्वेंशन यह है कि आप C में स्ट्रक्चर के रूप में क्या घोषित करेंगे, और क्लास के रूप में अगर हम प्राइवेट और प्रोटेक्टेड वैरिएबल, वर्चुअल फंक्शन, ctor और dtor, इत्यादि घोषित करते हैं। लेकिन यह सिर्फ एक सम्मेलन है, जिसे भाषा द्वारा लागू नहीं किया गया है
जियान पाओलो

-5

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


4
यह सच नहीं है। structकीवर्ड के साथ परिभाषित वर्ग और classइस संबंध में कीवर्ड के साथ परिभाषित वर्ग के बीच कोई अंतर नहीं है ।
ymett

जब मैं एक कंस्ट्रक्टर के साथ एक संरचना का उपयोग करता हूं, तो मुझे एक कंस्ट्रक्टर के साथ कक्षा की तुलना में बेहतर गति मिलती है।
अली

@ कोई नहीं तुम नहीं
ऑर्बिट

-5

कक्षाएं संदर्भ प्रकार हैं और संरचनाएं मान प्रकार हैं।
जब मैं कहता हूं कि कक्षाएं संदर्भ प्रकार हैं,
मूल रूप से उनमें एक उदाहरण चर का पता होगा।

उदाहरण के लिए:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

मुख्य विधि में,
मैं नए ऑपरेटर का उपयोग करके इस वर्ग का एक उदाहरण बना सकता हूं जो इस वर्ग के लिए मेमोरी आवंटित करता है
और उस के आधार पते को MyClass प्रकार चर (_myClassObject2) में संग्रहीत करता है।

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

उपरोक्त कार्यक्रम में, MyClass _myClassObject2 = _myClassObject1; निर्देश बताता है कि दोनों प्रकार के प्रकार MyClass

  1. myClassObject1
  2. myClassObject2

और उसी मेमोरी लोकेशन की ओर इशारा करेगा।
यह मूल रूप से उसी मेमोरी लोकेशन को उसी प्रकार के दूसरे वेरिएबल में असाइन करता है।

इसलिए यदि हम किसी भी प्रकार की किसी भी वस्तु में बदलाव करते हैं तो MyClass का दूसरे पर प्रभाव पड़ेगा
क्योंकि दोनों एक ही मेमोरी लोकेशन की ओर इशारा करते हैं।

"_myClassObject1.DataMember = 10;" इस पंक्ति में दोनों ऑब्जेक्ट के डेटा सदस्यों में 10 का मान होगा।
"_myClassObject2.DataMember = 20;" इस पंक्ति में दोनों ऑब्जेक्ट के डेटा सदस्य में 20 का मान होगा।
आखिरकार, हम पॉइंटर्स के माध्यम से किसी ऑब्जेक्ट के डेटाटैमर्स तक पहुंच रहे हैं।

कक्षाओं के विपरीत, संरचनाएं मूल्य प्रकार हैं। उदाहरण के लिए:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

उपरोक्त कार्यक्रम में,
नए ऑपरेटर का उपयोग करके MyStructure प्रकार की वस्तु को इंस्टेंट करना और
MyStructure के _myStructObject चर में पते को संग्रहीत करना और
"_myStructObject1.DataMember = 10" का उपयोग करके संरचना के डेटा सदस्य को मान 10 असाइन करना।

अगली पंक्ति में,
मैं MyStructure प्रकार का एक और चर _myStructObject2 घोषित कर रहा हूं और उस में _myStructObject1 असाइन कर रहा हूं।
यहाँ .NET C # कंपाइलर _myStructureObject1 ऑब्जेक्ट की एक और कॉपी बनाता है और
उस मेमोरी लोकेशन को MyStructure वेरिएबल _myStructObject2 में असाइन करता है।

इसलिए हम जो कुछ भी बदलाव करते हैं _ _StructObject1 पर एक और परिवर्तन नहीं होगा, वह MyStructrue के अन्य चर _myStructObject2 पर असर करेगा।
इसलिए हम कह रहे हैं कि संरचनाएं मूल्य प्रकार हैं।

तो क्लास के लिए तत्काल बेस क्लास ऑब्जेक्ट है और स्ट्रक्चर के लिए तत्काल बेस क्लास वैल्यू टाइप है जो ऑब्जेक्ट से विरासत में मिला है।
कक्षाएं एक विरासत का समर्थन करेंगी जबकि संरचनाएं नहीं होंगी।

हम यह कैसे कह रहे हैं?
और उसके पीछे क्या कारण है?
इसका जवाब है क्लासेस।

यह सार, सील, स्थिर और आंशिक हो सकता है और निजी, संरक्षित और संरक्षित आंतरिक नहीं हो सकता है।


4
मुझे लगता है कि यह c # के लिए सवाल का जवाब देने की कोशिश कर रहा है? सवाल सी ++ के बारे में है, और यह जवाब गलत बनाता है?
22

@smw बिल्कुल, उन्होंने C # में अपना नमूना कोड लिखा है और मैं यह जांचने के लिए आया हूं कि C ++ structऔर के बीच गुजरने वाले पैरामीटर में कोई अंतर नहीं था class। यहाँ किसी ने भी इसका उल्लेख नहीं किया है, न ही पूरे वेब ने। इसलिए मुझे नहीं लगता कि यह C ++ पर भी लागू होता है।
जॉन

यह सी # कोड भी मान्य नहीं है - कीवर्ड सभी गलत हैं। "पब्लिक", "स्टेटिक", "इंट", और "क्लास" को कैपिटल नहीं किया जाना चाहिए और यह "स्ट्रक्चर" होना चाहिए न कि "स्ट्रक्चर"। विवरण सी # के लिए अधिकतर सटीक है (हालांकि संरचनाएं अभी भी इंटरफेस विरासत में ले सकती हैं, बस अन्य संरचनाएं नहीं), लेकिन इस सवाल का जवाब नहीं देती हैं क्योंकि यह सी ++ के बारे में था ...
डारेल हॉफमैन

2
यह उत्तर पूर्ण बकवास है। यह अपने कोड उदाहरणों के लिए Visual Basic और C # के एक अजीब मिश्रण का उपयोग करता है, और पूरे "क्लास संदर्भ प्रकार और संरचनाएं मान प्रकार हैं" ... बात केवल .NET पर लागू होती है (यानी C #) C ++ के लिए नहीं। तुम गलत कमरे में हो, यार। यह वह जगह है जहाँ आप हैं: stackoverflow.com/questions/13049
फ़्लाश

लेकिन यह उत्तर इंगित करता है कि सी (++) के लिए वही मान्य है, जिसका उपयोग मूल्य प्रकार की तरह किया जाता है। int a = 3; int b = a;और इसी तरहMyStruct a=MyStruct("data"); MyStruct b = a;
भाग्योदय

-8

संरचना और वर्ग के बीच 3 बुनियादी अंतर हैं

1St- मेमोरी स्टैक मेमोरी में संरचना के लिए आरक्षित होती है (जो प्रोग्रामिंग भाषा के पास होती है) क्या स्टैक मेमोरी में क्लास केवल reffrence के लिए आरक्षित होती है और वास्तविक मेमोरी हीप मेमोरी में आरक्षित होती है।

2Nd - डिफ़ॉल्ट संरचना द्वारा एक सार्वजनिक के रूप में माना जाता है कि क्या वर्ग एक निजी के रूप में व्यवहार करता है।

3Rd- संरचना में कोड का पुन: उपयोग नहीं कर सकता है लेकिन कक्षा में हम एक ही कोड को कई बार इनहर्टेंस कह सकते हैं


2
C ++ संरचनाएं वंशानुक्रम और सार विधियों का समर्थन करती हैं। संरचना और वर्ग को उसी तरह आवंटित किया जाता है। ढेर पर वर्ग आवंटित करना भले ही वे "नए" के साथ तात्कालिक न हों एम्बेडेड सिस्टम के लिए कोई मतलब नहीं है।
JCMS

2
# 1 भी गलत है। स्टैक का उपयोग तब किया जाता है जब आप उस प्रकार के कुछ को स्थानीय चर के रूप में घोषित करते हैं, और जब आप "नया" ऑपरेटर का उपयोग करते हैं तो ढेर का उपयोग किया जाता है।
स्कोर_उंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.