2012-07-20 10 views
5

कक्षा एक्स -> दो तरीकों से वाई में परिवर्तित 1) कन्स्ट्रक्टर, और 2) रूपांतरण कार्यों द्वारा।
मुझे समझ में आया कि एकल तर्क कन्स्ट्रक्टर का उपयोग रूपांतरण के लिए किया जाता है।रचनाकारों द्वारा रूपांतरण

विनिर्देश में:

एक परोक्ष-घोषित प्रतिलिपि निर्माता एक स्पष्ट निर्माता नहीं है; इसे निहित प्रकार के रूपांतरण के लिए बुलाया जा सकता है।

प्रश्न:

तो, कि न केवल एक तर्क निर्माता रूपांतरण के लिए प्रयोग किया जाता है इसका मतलब है, लेकिन यह भी निर्माता नकल ?. यदि हां, तो किस परिदृश्य का उपयोग किया जाता है? नमूना कोड का कोई स्निपेट?

अगर प्रश्न बहुत आधार है तो कृपया मेरे साथ भालू।

+1

कॉपी-कन्स्ट्रक्टर एक एकल-तर्क कन्स्ट्रक्टर है। लेकिन यह इस प्रकार को नहीं बदलता है, इसलिए मुझे नहीं पता कि कोई इसे "रूपांतरण" क्यों कहता है। –

+1

मुझे पूरा यकीन है कि अगर मैं आपके साथ "बेकार" हूं तो मेरी पत्नी परेशान हो जाएगी। :-) –

+0

हाहा, जैरी, इंगित करने के लिए धन्यवाद। :) – Whoami

उत्तर

1

लागू रूप से घोषित प्रतिलिपि बनाने वाले रूपांतरणों के लिए उपयोग नहीं कर सकते हैं, क्योंकि यह copy-ctor है, जिसने T(const T&) या T(T&) के रूप में घोषित किया है।

ड्राफ्ट n3337 पैरा 12.8 सी ++ मानक। एक्स से प्रत्येक सीधा या आभासी आधार वर्ग बी है एक प्रति निर्माता जिनकी पहली पैरामीटर - अगर

8 एक दसवीं कक्षा के लिए परोक्ष-घोषित प्रतिलिपि निर्माता प्रपत्र एक्स :: एक्स (स्थिरांक एक्स &) होगा टाइप कॉन्स बी & या कॉन्स अस्थिर बी & है, और एक्स के सभी गैर-स्थैतिक डेटा सदस्यों के लिए कक्षा प्रकार एम (या इसके सरणी) के हैं, प्रत्येक ऐसे वर्ग प्रकार की प्रतिलिपि कन्स्ट्रक्टर है जिसका पहला पैरामीटर प्रकार कॉन्स एम & या कॉन्स अस्थिर एम & है .11 9 अन्यथा, निहित रूप से घोषित करें घ प्रतिलिपि निर्माता प्रपत्र होगा एक्स :: एक्स (एक्स &)

के बाद से प्रति सी टो स्पष्ट नहीं है

struct So 
{ 
}; 

int main() 
{ 
    So s = So(); 
} 

हैं copy-ctor स्पष्ट है कि आप केवल इस्तेमाल कर सकते हैं आप इस तरह के कोड का उपयोग कर सकते So s((So()));

+0

इसे सामान्यता के लिए टी से टी में रूपांतरण कहा जा सकता है। –

+0

@ सर्गेईके। "हो सकता है" जैसा "है" जैसा ही है। क्या यह एक रूपांतरण है या नहीं? – curiousguy

+0

@curiousguy: मेरे उत्तर में .pdf की जांच करें –

3

प्रतिलिपि बनाने वाला एक स्पष्ट निर्माता नहीं है, इसलिए जहां भी संभव हो, इसका उपयोग किया जाएगा। कॉपी कन्स्ट्रक्टर केवल उसी प्रकार से "रूपांतरित" होगा, इसलिए यह पूरी तरह से एक रूपांतरण नहीं है। हालांकि, सामान्यता के लिए इसे एक कॉल करना आसान है।

इस पेपर को पढ़ें: http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf यदि आप रूपांतरण कन्स्ट्रक्टर पर अधिक जानकारी चाहते हैं।

+0

"_Copy कन्स्ट्रक्टर एक स्पष्ट कन्स्ट्रक्टर नहीं है, इसलिए जहां भी संभव हो इसका उपयोग किया जाएगा ._" और जहां भी असंभव हो वहां एक स्पष्ट कन्स्ट्रक्टर का उपयोग किया जाएगा। – curiousguy

+0

@curiousguy: तो वे बहुत समान हैं, है ना? –

1

एक निहित प्रति रचनाकार वह है जो संकलक आपके लिए लिखता है। यह हमेशा प्रपत्र

T(const T&); 

इसका मतलब है कि जो const T& में रूपांतरण ऑपरेटर है किसी भी वस्तु परोक्ष कॉपी किया जा सकता है, भले ही यह नहीं है कि तुम क्या चाहते थे। इसे ट्रिगर करने का सबसे आम तरीका एक व्युत्पन्न वर्ग से बेस क्लास में प्रतिलिपि बनाना है; इसे ऑब्जेक्ट स्लाइसिंग कहा जाता है क्योंकि प्रतिलिपि मूल के समान प्रकार नहीं होगी और शायद कुछ महत्वपूर्ण गुण या व्यवहार खो जाएगी।

+3

हमेशा नहीं। 12.8 पैरा क्लॉज 8 एन 3337 ड्राफ्ट। – ForEveR

+0

@ForEveR, यह इंगित करने के लिए धन्यवाद - मुझे नहीं पता था कि अपवाद थे। मुझे अभी भी मुश्किल समय लग रहा है कि व्यावहारिक किनारे के मामले मानक पढ़ने से क्या हैं। –

+1

@ मार्क: असल में, यदि आपकी कक्षा में 'auto_ptr' है (आप क्यों होंगे, क्योंकि' unique_ptr' जोड़ा गया था?), तो आपके निहित रूप से जेनरेट की गई "कॉपी कन्स्ट्रक्टर" में सेमेन्टिक्स चलेंगे। –

2

यह मूल रूप से मतलब है कि आप ऐसा कर सकते हैं:

struct A {}; 
A a; 
A b = a; 

तो प्रतिलिपि निर्माता स्पष्ट है कि संकलित करने के लिए विफल हो जाएगा चिह्नित किया गया था। आप इसे जोड़कर परीक्षण कर सकते हैं: explicit A(A const &) {} प्रोग्राम में और प्रोग्राम को पुन: सम्मिलित करने के लिए।

+0

क्या यह एक रूपांतरण है? – curiousguy

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