Con trỏ tới thành viên trong C++ có thể được hiểu là định nghĩa "bù đắp". Mặc dù có một số biến chứng khi bạn có các chức năng ảo, nhưng trong trường hợp của bạn, điều này là đủ tốt.
Vì vậy, về cơ bản mã của bạn là giống như (nếu chúng ta biến kiểu dữ liệu để "thô" dữ liệu)
int extract(void *p, int offset)
{
return *((int*)(p+offset));
}
(nói về mặt kỹ thuật, các mã trên không được biên dịch, vì một con trỏ void *
không thể được sử dụng trong biểu hiện bổ sung như trình biên dịch không biết kích thước của con trỏ, nhưng chúng ta hãy bỏ qua điều này cho bây giờ.)
và khi bạn gọi nó, mã trông giống như
extract(p, __offsetof(Person, id));
trong đó __offsetof
là một toán tử giả mà trình biên dịch sẽ tính toán nó tại thời gian biên dịch.
Bạn có thể thấy không có phép thuật ở đây. Những gì C++ giúp bạn là bù đắp được bảo vệ trong một loại dữ liệu đặc biệt, vì vậy bạn không được phép thay đổi nội bộ của nó và vì vậy tránh phá vỡ những thứ ngoài.
Thông tin thêm về C/C++ đúc con trỏ và số học
Đoạn mã trên là khá cơ bản để C/C++ sử dụng, mặc dù nó không phải là hình thức C++ chuyên nghiệp muốn nhìn thấy (phải sử dụng static_cast
hay reinterpret_cast
thay vì đúc C stype).
Tôi thấy người hỏi câu hỏi giải thích thêm về số học con trỏ C/C++, và đây là một chút chủ đề vì nó không liên quan gì đến câu hỏi ở đây, vì vậy thay vào đó tôi đưa ra một số tham khảo thêm về chủ đề này.
Pointer Arithmetic
http://www.technoplaza.net/programming/lesson9p2.php
http://www.informit.com/articles/article.aspx?p=686170&seqNum=8
'Person' là một cái tên loại, không phải là một rvalue –
'& Person :: id' được nội biểu diễn như là một bù đắp vào bất kỳ đối tượng' Person'. –
"Chúng tôi đang đi qua' & Person :: id' cơ bản bộ nhớ "- chính xác những gì bạn có nghĩa là bằng cách này? "Bộ nhớ cơ bản" là gì? – AnT