gì Stanley nghĩa của “đệ quy” chỉ là rằng các nhà điều hành được áp dụng cho mọi đối tượng quay trở lại cho đến khi sự kiểu trả về là một con trỏ.
Điều gì xảy ra ở đây trong lần thử đầu tiên: screen::operator ->
trả về một con trỏ. Vì vậy, đây là cuộc gọi cuối cùng đến một operator ->
mà trình biên dịch thử. Sau đó, nó sẽ xử lý con xúc xắc bên phải của toán tử (p
) bằng cách tra cứu một thành viên theo kiểu con trỏ trả về (dummy
) với tên đó.
Về cơ bản, bất cứ khi nào trình biên dịch thấy cú pháp aᵢ->b
trong mã, nó chủ yếu áp dụng các thuật toán sau đây:
- là
aᵢ
kiểu con trỏ? Nếu có, hãy giải quyết thành viên b
của số *aᵢ
và gọi (*aᵢ).b
.
- Khác, cố gắng giải quyết
aᵢ::operator ->
- Khi thành công, hãy đặt
aᵢ₊₁ = aᵢ::operator ->()
. Goto 1.
- Khi lỗi, phát ra lỗi biên dịch.
tôi cứng ép để đến với một đoạn ngắn, ví dụ có ý nghĩa, nơi một chuỗi của operator ->
invocations thậm chí có ý nghĩa. Có lẽ chỉ sử dụng thực sự là khi bạn viết một lớp con trỏ thông minh.
Tuy nhiên, ví dụ về đồ chơi sau đây ít nhất là biên dịch và mang lại một con số. Nhưng tôi sẽ không khuyên thực sự viết mã như vậy. Nó phá vỡ đóng gói và làm cho mèo con khóc.
#include <iostream>
struct size {
int width;
int height;
size() : width(640), height(480) { }
};
struct metrics {
size s;
size const* operator ->() const {
return &s;
}
};
struct screen {
metrics m;
metrics operator ->() const {
return m;
}
};
int main() {
screen s;
std::cout << s->width << "\n";
}
Nguồn
2012-05-05 09:56:30
Trường hợp nói rằng nó được "áp dụng đệ quy"? –
Không, tôi không đồng ý ví dụ của bạn hoạt động như mong đợi, -> opertor chỉ là một cuộc gọi hàm trong bản chất, tại sao nó nên đi sâu? Nếu nó làm điều đó như thế nào bạn sẽ kiểm soát ở mức độ để ngăn chặn dereferencing và nó sẽ làm cho thừa kế và đa hình thậm chí phức tạp hơn nó đã là – EdChum
C++ Primer, Ấn bản thứ tư Bởi Stanley B. Lippman, phần 14.6 đoạn cuối cùng. – user1232138