मैं संकेत बनाम संदर्भ के वाक्यविन्यास और सामान्य शब्दार्थ को समझता हूं, लेकिन मुझे यह कैसे तय करना चाहिए कि एपीआई में संदर्भ या संकेत का उपयोग करना अधिक या कम उपयुक्त है?
स्वाभाविक रूप से कुछ स्थितियों को एक या दूसरे की operator++
आवश्यकता होती है ( संदर्भ तर्क की आवश्यकता होती है), लेकिन सामान्य तौर पर मुझे पता चल रहा है कि मैं पॉइंटर्स (और कॉन्स्ट पॉइंटर्स) का उपयोग करना पसंद करता हूं क्योंकि वाक्य रचना स्पष्ट है कि चर को विनाशकारी रूप से पारित किया जा रहा है।
निम्न कोड में जैसे:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
सूचक के साथ, यह हमेशा (अधिक) स्पष्ट है कि क्या चल रहा है, इसलिए एपीआई के लिए और जैसे कि जहां स्पष्टता एक बड़ी चिंता है, संकेत संदर्भों से अधिक उपयुक्त नहीं हैं? क्या इसका मतलब यह है कि संदर्भ केवल तभी उपयोग किया जाना चाहिए जब आवश्यक हो (उदाहरण के लिए operator++
)? क्या एक या दूसरे के साथ कोई प्रदर्शन चिंताएं हैं?
संपादित (बाहर):
NULL मान और कच्चे सरणियों के साथ काम करने की अनुमति देने के अलावा, ऐसा लगता है कि पसंद व्यक्तिगत पसंद के लिए नीचे आती है। मैंने Google के C ++ स्टाइल गाइड के संदर्भ में नीचे दिए गए उत्तर को स्वीकार कर लिया है , क्योंकि वे इस दृश्य को प्रस्तुत करते हैं कि "संदर्भ भ्रामक हो सकते हैं, क्योंकि उनके पास सिंटैक्स लेकिन पॉइंटर शब्दार्थ है।"
सूचक तर्कों को सैनिटाइज़ करने के लिए आवश्यक अतिरिक्त काम के कारण जो NULL नहीं होना चाहिए (जैसे add_one(0)
कि रनटाइम के दौरान पॉइंटर संस्करण को कॉल करेगा और तोड़ देगा), यह संदर्भ क्षमता का उपयोग करने के लिए उन संदर्भों से समझ में आता है जहां एक ऑब्जेक्ट मौजूद होना चाहिए, हालांकि यह शर्म की बात है। वाक्यात्मक स्पष्टता खोने के लिए।
add_one(a);
में स्पष्ट नहीं है कि क्या a
संशोधित होने जा रहा है? यह कोड में सही कहता है: एक जोड़ें ।
addOneTo(...)
। यदि आप ऐसा नहीं करना चाहते हैं, तो बस घोषणा को देखें।