Tôi đang cố gắng để hiểu được sự nhất quán trong các lỗi được ném vào chương trình này:Pointer-to-thành viên nhầm lẫn
#include <iostream>
class A{
public:
void test();
int x = 10;
};
void A::test(){
std::cout << x << std::endl; //(1)
std::cout << A::x << std::endl; //(2)
int* p = &x;
//int* q = &A::x; //error: cannot convert 'int A::*' to 'int*' in initialization| //(3)
}
int main(){
const int A::* a = &A::x; //(4)
A b;
b.test();
}
Đầu ra là 10 10
. Tôi dán nhãn 4 điểm của chương trình, nhưng (3) là mối quan tâm lớn nhất của tôi:
x
được lấy thường từ bên trong một hàm thành viên.x
đối tượng được tìm nạp bằng toán tử phạm vi và giá trị lvalue cho đối tượngx
được trả về.- Được tặng trả lại số
int
giá trị bằng (2), tại sao sau đó&A::x
trả về khôngint*
nhưng thay vì trả vềint A::*
? Toán tử phạm vi thậm chí được ưu tiên trước toán tử&
đểA::x
phải chạy trước, trả về giá trịint
trước khi địa chỉ được thực hiện. tức là điều này phải giống như&(A::x)
? (Thêm dấu ngoặc đơn thực sự hoạt động bằng cách này). - Một chút khác biệt ở đây tất nhiên, toán tử phạm vi đề cập đến một thành viên lớp nhưng không có đối tượng nào được tham chiếu.
Vậy tại sao chính xác không A::x
không trả về địa chỉ của đối tượng x
nhưng thay vì trả về địa chỉ của các thành viên, bỏ qua ưu tiên của ::
trước &
?
Tôi nghĩ nếu nó hoạt động theo cách khác, điều đó sẽ dẫn đến nhiều nhầm lẫn hơn. Cùng một chuỗi số nhận dạng và toán tử, tham chiếu cùng loại và thành viên chính xác, có nghĩa là hai thứ khác nhau tùy thuộc vào phạm vi: âm thanh như sự cố với tôi. –
@JohnSensebe chắc chắn. Ban đầu tôi viết "quirk", nhưng đây thực ra là một lựa chọn rất hợp lý, mặc dù ban đầu nó có vẻ lạ lùng. – Quentin