Tên lớp được chèn có nghĩa X
là được khai báo là thành viên của X
, do đó, tra cứu tên bên trong X
luôn tìm thấy lớp hiện tại, không phải là tên khác X
có thể được khai báo ở cùng phạm vi kèm theo, ví dụ:
void X() { }
class X {
public:
static X create() { return X(); }
};
Là create()
hàm tạo một X
đối tượng tạm thời hoặc gọi hàm X
? Ở phạm vi không gian tên, nó sẽ gọi hàm, vì vậy mục đích của tên lớp được chèn là để đảm bảo rằng trong phần thân của X
tên luôn tìm thấy chính lớp đó (vì việc tra cứu tên bắt đầu trong phạm vi riêng của lớp trước khi tìm trong bao vây phạm vi).
Nó cũng hữu ích bên trong các mẫu lớp, trong đó tên lớp được chèn có thể được sử dụng mà không có danh sách đối số mẫu, ví dụ: sử dụng đơn giản Foo
thay vì id mẫu đầy đủ Foo<blah, blah, blah>
, vì vậy thật dễ dàng để tham khảo tức thời hiện tại. Xem DR 176 để biết sự thay đổi giữa C ++ 98 và C ++ 03 đã làm rõ điều đó.
Ý tưởng về tên lớp được thêm vào đã có trong C ++ 98, nhưng thuật ngữ này là mới đối với C ++ 03.
C ++ 98 nói:
Một tên lớp được chèn vào phạm vi mà nó được khai báo ngay sau khi nhìn thấy tên lớp . Tên lớp cũng được chèn vào phạm vi của chính lớp đó.
Câu thứ hai đã được thay đổi bởi DR 147, vì vậy C ++ 03 nói trong [class] / 2:
Một tên lớp được chèn vào phạm vi mà nó được khai báo ngay sau khi nhìn thấy tên lớp . Tên lớp cũng được chèn vào phạm vi của chính lớp đó; cái này được gọi là tên lớp tiêm .
Ngay cả trước C ++ 98, ARM có từ ngữ gần tương đương, có nghĩa là tên của lớp luôn có thể được sử dụng trong thân lớp để chỉ chính lớp đó:
Tên của một lớp có thể được sử dụng làm tên lớp ngay cả trong danh sách thành viên của chính trình xác định lớp.
- Ví dụ,
class link { link* next; };