इंजेक्ट किए गए वर्ग नाम का अर्थ है कि Xएक सदस्य के रूप में घोषित किया गया है X, ताकि नाम खोज Xहमेशा वर्तमान वर्ग का पता लगाता है, न Xकि किसी अन्य को उसी संलग्नक दायरे में घोषित किया जा सकता है, जैसे।
void X() { }
class X {
public:
static X create() { return X(); }
};
क्या create()फ़ंक्शन एक अस्थायी Xऑब्जेक्ट बना रहा है या फ़ंक्शन को कॉल कर रहा है X? नाम स्थान के दायरे में यह कार्य कहेगा, इसलिए इंजेक्शन-वर्ग-नाम का उद्देश्य यह सुनिश्चित करना है कि Xनाम के शरीर के भीतर हमेशा वर्ग खुद को ढूंढता है (क्योंकि नाम का पता लगने से पहले वर्ग 'स्वयं के दायरे में शुरू होता है' गुंजाइश)।
यह क्लास के टेम्प्लेट के अंदर भी मददगार है, जहाँ इंजेक्ट किए गए क्लास के नाम को टेम्प्लेट तर्क-वितर्क सूची के बिना इस्तेमाल किया जा सकता है, जैसे Fooकि फुल टेम्प्लेट-आईडी के बजाय बस Foo<blah, blah, blah>का उपयोग करना, इसलिए वर्तमान तात्कालिकता को संदर्भित करना आसान है। C ++ 98 और C ++ 03 के बीच परिवर्तन के लिए DR 176 देखें, जिसने स्पष्ट किया है।
इंजेक्टेड क्लास नाम का विचार C ++ 98 में मौजूद था, लेकिन C ++ 03 के लिए शब्दावली नई थी।
C ++ 98 कहता है:
एक वर्ग-नाम उस दायरे में डाला जाता है जिसमें वर्ग-नाम देखे जाने के तुरंत बाद घोषित किया जाता है। क्लास-नेम को भी क्लास के दायरे में ही डाला जाता है।
दूसरा वाक्य DR 147 द्वारा बदल दिया गया था, इसलिए C ++ 03 में कहा गया है: [वर्ग] / 2:
एक वर्ग-नाम उस दायरे में डाला जाता है जिसमें वर्ग-नाम दिखने के तुरंत बाद घोषित किया जाता है। वर्ग-नाम भी वर्ग खुद के दायरे में डाला जाता है; इसे इंजेक्शन-क्लास-नाम के रूप में जाना जाता है ।
सी ++ 98 से पहले भी, एआरएम के पास लगभग बराबर शब्द है जिसका अर्थ है कि कक्षा के नाम का उपयोग हमेशा क्लास बॉडी में किया जा सकता है:
एक वर्ग के नाम को वर्ग-नाम के रूप में भी उपयोग किया जा सकता है, यहां तक कि वर्ग निर्दिष्ट सदस्य की सूची के भीतर भी ।
- उदाहरण के लिए,
class link { link* next; };