ชื่อคลาสที่ถูกฉีดหมายความว่าX
ประกาศให้เป็นสมาชิกX
ดังนั้นการค้นหาชื่อภายในX
จะค้นหาคลาสปัจจุบันเสมอไม่ใช่ชื่ออื่นX
ที่อาจถูกประกาศในขอบเขตการล้อมรอบเดียวกันเช่น
void X() { }
class X {
public:
static X create() { return X(); }
};
เป็นcreate()
ฟังก์ชั่นการสร้างชั่วคราวX
วัตถุหรือเรียกฟังก์ชั่นX
? ที่ขอบเขตเนมสเปซจะเรียกใช้ฟังก์ชันดังนั้นจุดประสงค์ของชื่อคลาสที่ถูกแทรกคือเพื่อให้แน่ใจว่าภายในเนื้อความของX
ชื่อจะค้นหาคลาสเองเสมอ (เนื่องจากการค้นหาชื่อเริ่มต้นในขอบเขตของคลาสก่อนที่จะมองหาสิ่งที่แนบ ขอบเขต).
นอกจากนี้ยังมีประโยชน์ในเทมเพลตของชั้นเรียนซึ่งสามารถใช้ชื่อคลาสที่ฉีดได้โดยไม่มีรายการอาร์กิวเมนต์เทมเพลตเช่นใช้Foo
แทนเท็มเพลตไอดีแบบเต็มFoo<blah, blah, blah>
ดังนั้นจึงง่ายต่อการอ้างถึงอินสแตนซ์ปัจจุบัน ดูDR 176สำหรับการเปลี่ยนแปลงระหว่าง C ++ 98 และ C ++ 03 ที่ทำให้ชัดเจน
แนวคิดของชื่อคลาสที่ถูกฉีดนั้นมีอยู่ใน C ++ 98 แต่คำศัพท์นั้นใหม่สำหรับ C ++ 03
C ++ 98 พูดว่า:
ชื่อชั้นถูกแทรกเข้าไปในขอบเขตในการที่จะมีการประกาศทันทีหลังจากที่ชื่อชั้นจะเห็น ชื่อคลาสจะถูกแทรกลงในขอบเขตของคลาสเองด้วย
ประโยคที่สองถูกเปลี่ยนแปลงโดยDR 147ดังนั้น C ++ 03 พูดว่าใน [class] / 2:
ชื่อชั้นถูกแทรกเข้าไปในขอบเขตในการที่จะมีการประกาศทันทีหลังจากที่ชื่อชั้นจะเห็น ชื่อชั้นยังเป็นที่ใส่เข้าไปในขอบเขตของชั้นเองนั้น นี้เป็นที่รู้จักกันฉีดชั้นชื่อ
ก่อนถึง C ++ 98 ARM มีถ้อยคำที่เทียบเท่ากันโดยคร่าวๆซึ่งหมายความว่าชื่อคลาสสามารถใช้ในคลาสของร่างกายเพื่ออ้างถึงคลาสได้:
ชื่อของคลาสสามารถใช้เป็นชื่อคลาสได้แม้ภายในรายชื่อสมาชิกของตัวระบุคลาสเอง
- ตัวอย่างเช่น,
class link { link* next; };