c++ - Is there a difference between defining member functions inside vs outside the class definition? -


निम्नलिखित चार सदस्य कार्य घोषणाओं और परिभाषाओं पर विचार करें:

  // ==== फ़ाइल: xh #ifndef X_H # परिभाषित X_H कक्षा X {सार्वजनिक: int a (int i) {वापसी 2 * i; } इनलाइन एट बी (इंट आई) {रिटर्न 2 * आई; } Int c (int i); Int d (int i); }; इनलाइन ई एक्स :: सी (इंट आई) {रिटर्न 2 * आई; } Int x :: d (int i) {वापसी 2 * i; } #endif  

पूर्णता के लिए, यहां सीपीपी फ़ाइल है जो एक एक्स का इन्स्तांत करती है और तरीकों को कॉल करती है ...

  // ==== फ़ाइल : X.cpp #include "xh" #include & lt; stdio.h & gt; Int main () {X एक्स; Printf ("a (3) =% d \ n", x.a (3)); Printf ("b (3) =% d \ n", x.b (3)); Printf ("c (3) =% d \ n", x.c (3)); Printf ("d (3) =% d \ n", x.d (3)); वापसी 0; }  

मेरा प्रश्न: क्या चार तरीकों में कोई मुख्य अंतर है? मैं एक टिप्पणी से समझता हूं कि कंपाइलर स्वचालित रूप से उन तरीकों को इनलाइन कर सकता है जिन्हें कक्षा परिभाषा में परिभाषित किया गया है

अद्यतन

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

मैं भी (अब) समझता हूँ कि विधि d लिखित रूप में जोखिम भरा है: चूंकि यह रेखांकित नहीं है, अगर एकाधिक अनुवाद इकाइयां हैं तो यह बहुसंख्यक परिभाषित किया जाएगा।

मेरा प्रश्न : क्या चार तरीकों में कोई भी प्रमुख अंतर है? (जैसा कि उल्लेख किया गया है, मुझे पता है कि विधि d अलग है)। लेकिन - बस के रूप में महत्वपूर्ण - वहाँ शैलीत्मक या मुहावरेदार विचार हैं जो एक डेवलपर दूसरों पर एक का चयन करेंगे?

चूंकि यह उत्तर अपवोट्स बना रहा है, इसलिए मुझे इसे सुधारने के लिए बाध्य होना चाहिए। लेकिन जो कुछ मैं जोड़ रहा हूं उससे पहले ही अन्य उत्तर और टिप्पणियों में कहा गया है, और उन लेखकों को क्रेडिट के लायक हैं।

इस विषय पर कि क्या कक्षा परिभाषा के अंदर एक फ़ंक्शन बॉडी रखने के बीच अंतर है या इसके ठीक नीचे ( लेकिन अभी भी हैडर फ़ाइल में ), इसके बारे में सोचने के लिए 3 अलग-अलग मामलों हैं:

1) फ़ंक्शन एक टेम्पलेट नहीं है और इनलाइन होने के लिए घोषित नहीं किया गया है । इस मामले में यह क्लास परिभाषा में परिभाषित किया जाना चाहिए या एक अलग सीपीपी या आप एक लिंकर त्रुटि मिल जाएंगे जैसे ही आप एक से अधिक संकलन इकाई में एच को शामिल करने का प्रयास करेंगे।

2) फ़ंक्शन एक टेम्पलेट, लेकिन इनलाइन घोषित नहीं किया गया है। इस मामले में, कक्षा की परिभाषा के भीतर शरीर को डालने से कंपाइलर को संकेत मिलता है कि फ़ंक्शन को इनलाइन किया जा सकता है (लेकिन अंतिम निर्णय अब भी अपने विवेक पर है)।

3) फ़ंक्शन को घोषित किया गया है इनलाइन होना इस मामले में कोई अर्थ अंतर नहीं है, लेकिन निर्भरता चक्र को समायोजित करने के लिए फ़ंक्शन बॉडी को नीचे रखने के लिए कभी-कभी आवश्यक हो सकता है।

मूल उत्तर, जो अच्छी जानकारी प्रदान करता है लेकिन वास्तविकता को संबोधित नहीं करता प्रश्न:

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


Comments

Popular posts from this blog

import - Python ImportError: No module named wmi -

Editing Python Class in Shell and SQLAlchemy -

lua - HowTo create a fuel bar -