2010-07-12 10 views
7

से गुजरने में समस्या क्या मैं एक फ़ंक्शन अधिभारित कर सकता हूं जो संदर्भ या चर नाम लेता है?संदर्भ

उदाहरण के लिए, जब मैं यह करने के लिए प्रयास करें:

void function(double a); 
void function(double &a); 

मैं इस समारोह के फोन करने वाले चाहते हैं करने के लिए सक्षम होने के लिए:

double a = 2.5; 
function(a); // should call function(double &a) 
function(2.3); // should call function(double a) 

मैं लिखने के लिए करना चाहते हैं पास-दर- बेहतर स्मृति उपयोग के लिए संदर्भ कार्य और दायरे के बाहर परिवर्तनीय के संभावित हेरफेर, लेकिन एक नया चर बनाने के बिना बस मैं फ़ंक्शन को कॉल कर सकता हूं।

क्या यह संभव है?

चीयर्स

+1

मुझे लगता है कि यह आम तौर पर संभव है, हालांकि आपके उदाहरण में, दोनों 'फ़ंक्शन (डबल ए)' कॉल करेंगे, एक int है, और एक डबल के संदर्भ के रूप में नहीं लिया जा सकता है। – falstro

+0

इसके बारे में खेद है, एक कहना है कि एक डबल है। प्रश्न में सुधार –

+0

"स्कोप के बाहर परिवर्तनीय के संभावित हेरफेर" से आपका क्या मतलब है, और यह 'फ़ंक्शन (2.3) ' – Roddy

उत्तर

8

मुझे लगता है कि आप यहां बिंदु खो रहे हैं। आपको वास्तव में क्या होना चाहिए:

void function(const double &a); 

"कॉन्स्ट" नोट करें। इसके साथ, आपको हमेशा पास-दर-संदर्भ प्राप्त करना चाहिए। यदि आपके पास संदर्भ द्वारा गैर-कॉन्स पास है, तो संकलक सही ढंग से मान लेगा कि आप पास ऑब्जेक्ट को संशोधित करना चाहते हैं - जो निश्चित रूप से पास-बाय-वैल्यू संस्करण के साथ अवधारणात्मक रूप से असंगत है।

कॉन्स संदर्भों के साथ, कंपाइलर खुशी से आपकी पीठ के पीछे अस्थायी वस्तु बना देगा। गैर-कॉन्स संस्करण आपके लिए काम नहीं करता है, क्योंकि संकलक केवल इन अस्थायी को "कॉन्स्ट" ऑब्जेक्ट्स के रूप में बना सकता है।

+0

कैवेट: यदि "फ़ंक्शन" को रेखांकित नहीं किया जा सकता है, तो "डबल डबल" और अधिक महंगा हो सकता है क्योंकि यह स्मृति में "ए" को मजबूर करता है। अधिकांश कंपेलर रजिस्टरों में युगल पास करेंगे यदि उनके तर्क मोड मूल्य से हैं। –

+2

दरअसल। सी ++ में सम्मेलन आमतौर पर मूल्य से अंतर्निहित प्रकार (int, double, char, pointers, आदि) को पास करता है, और संदर्भ के अनुसार समग्र प्रकार (कक्षाएं और structs)। –

+0

@ टाइयलर, लूथर। आप निश्चित रूप से दोनों सही हैं। मुझे लगता है कि 'डबल' की पसंद सिर्फ एक प्रकार (थोड़ा खराब) उदाहरण के रूप में चुनी गई है ... – Roddy

0

मुझे नहीं लगता कि परिभाषा:

void function(double a); 
void function(double &a); 

संभव है ... कैसे संकलक पता होगा जो function(x) के लिए कॉल करने के लिए कार्य करते हैं? यदि आप संदर्भ और मूल्य दोनों द्वारा उपयोग करना चाहते हैं, तो आपको दो अलग-अलग कार्यों का उपयोग करना चाहिए। यह इस अस्पष्ट अधिभार की तुलना में कोड को पढ़ने में भी आसान बना देगा।

+0

के साथ कैसे काम करेगा, मुझे लगता है कि यह संभव है, और यदि संभव हो तो संदर्भ-संस्करण को प्राथमिकता दी जाएगी । हालांकि उस दावे को वापस करने के लिए कुछ भी नहीं मिला है। – falstro

+0

मान लीजिए कि मैं इसे विभिन्न कंपाइलर्स के साथ आज़माउंगा ... – Tapdingo

+0

जीसीसी 4.1.2: त्रुटि: ओवरलोडेड 'फ़ंक्शन (int &)' की कॉल संदिग्ध है – Tapdingo

1

मैं इसे करने की कोशिश की, और यह कम से कम MSVC2008 में

विफल रहा है, यह संभव नहीं है - और मैं यह सब करने के लिए C++ applys लगता है - संकलनकर्ता।

definiton ही मान्य है, लेकिन जब एक पैरामीटर के रूप में एक चर के साथ समारोह

function(a); 

कॉल करने के लिए कोशिश कर रहा है, एक संकलक त्रुटि के रूप में संकलक तय करने के लिए जो उपयोग करने के लिए कार्य करते हैं असमर्थ है उठाया है।

-1

नहीं, आप यह coz नहीं कर सकते हैं दोनों कार्य प्रभावी रूप से समान उलझन वाले नामों का उत्पादन करेंगे और लिंकर फ़ंक्शन कॉल को हल करने में असमर्थ होगा।

+0

उम। नहीं। एक संदर्भ पैरामीटर एक सामान्य नाम (प्रतिलिपि पैरामीटर) के रूप में समान नाम उत्पन्न नहीं करेगा। यह कहने के बराबर होगा कि एक पॉइंटर-टू-डबल और डबल पैरामीटर दोनों एक ही नाम को जोड़ते हैं। – falstro

1
void function(double const &a); // instead of void function(double a); 
void function(double  &a); 
0

संदर्भ द्वारा पीओडी-प्रकारों को पारित करने का कोई लाभ नहीं है, क्योंकि वे रजिस्ट्री में लगभग हमेशा (हमेशा?) पास होते हैं। कॉम्प्लेक्स प्रकारों द्वारा पारित जटिल प्रकार (जिनमें केवल एक पीओडी-चर से अधिक होता है) सामान्य रूप से (हमेशा?: डी) प्रतिलिपि बनाने और स्टैक पुश पर एक preferable तरीका है। आप पीओडी-प्रकारों से explicit constructors

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