आदिम प्रकार दोनों के बराबर हैं, यह उपयोगकर्ता परिभाषित वर्ग प्रकारों के लिए है कि एक अंतर है। दोनों मामलों में जो कोड निष्पादित हो जाता है वह वही होगा (मूल अनुकूलन के बाद), लेकिन प्रकारों की आवश्यकताएं अलग-अलग होती हैं यदि हम जिस तत्व से प्रारंभ कर रहे हैं वह उस प्रकार का नहीं है जिसे हम बना रहे हैं।
कॉपी-प्रारंभ (T t = u;
) प्रकार T
कि परोक्ष t
को u
से बदल दिया गया है की एक अस्थायी से निर्माण कॉपी करने के लिए बराबर है। दूसरी तरफ प्रत्यक्ष-प्रारंभिक उचित कन्स्ट्रक्टर को सीधे कॉल के बराबर है।
जबकि अधिकांश परिस्थितियों में कोई अंतर नहीं होगा, अगर निर्माता कि u
लेता explicit
घोषित किया जाता है या यदि कॉपी-निर्माता दुर्गम है, तो कॉपी-प्रारंभ असफल हो जायेगी:
struct A {
explicit A(int) {}
};
struct B {
B(int) {}
private:
B(B const &);
};
int main() {
A a(1); // ok
B b(1); // ok
// A a2 = 1; // error: cannot convert from int to A
// B b2 = 1; // error: B(B const &) is not accessible
}
कुछ ऐतिहासिक पृष्ठभूमि के लिए, प्रारंभिक रूप से आदिम प्रकारों को प्रति-प्रारंभिक के साथ शुरू किया जाना था। जब * कक्षा से सदस्य विशेषताओं को प्रारंभ करने के लिए प्रारंभकर्ता-सूची * एस को भाषा में जोड़ा गया था, तो यह निर्णय लिया गया था कि आदिम प्रकारों को उसी वाक्यविन्यास के साथ प्रारंभ किया जाना चाहिए जो कक्षाओं को प्रारंभकर्ता सूची वर्दी और सरल में वाक्यविन्यास रखने के लिए किया जाना चाहिए। साथ ही प्रति-प्रारंभिक के माध्यम से कक्षाओं के प्रारंभिकरण की अनुमति देने से उपयोगकर्ता परिभाषित प्रकारों को आदिम प्रकारों के करीब बना दिया जाता है। दो प्रारंभिक प्रारूपों में अंतर स्वाभाविक रूप से आता है: int a = 5.0;
को 5.0
से int
पर रूपांतरण के रूप में संसाधित किया जाता है, और उसके बाद int
से प्रारंभ होता है। उपयोगकर्ता परिभाषित प्रकारों के साथ ही जाता है: T u = v;
को v
से T
पर रूपांतरण के रूप में संसाधित किया जाता है, और फिर उस परिवर्तित मूल्य से u
का निर्माण प्रतिलिपि बनाएँ।
स्रोत
2011-07-19 19:32:41
यह एक घोषणा नहीं है, इसकी परिभाषा है। उस ट्यूटोरियल को हटाएं और [एक सभ्य पुस्तक पढ़ें] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)। सी ++ में सोच मुफ्त है और लेखक के पेज से उपलब्ध है। –
@ कैट प्लस प्लस: यह एक परिभाषा है, लेकिन इसका मतलब यह नहीं है कि यह घोषणा नहीं है। –
@JamesMcNellis: यह एक ट्यूटोरियल होना चाहिए और कॉलिंग परिभाषा घोषणाएं दोनों के बीच भ्रम से छुटकारा पाने में मदद नहीं करती हैं। शायद मैं आज सिर्फ क्रैकी हूँ। : पी –