2011-08-05 18 views
29

Ai đó có thể xin giải thích này với tôiSự khác biệt giữa & (* similarObject) và similarObject? Họ có giống nhau không?

dynamic_cast<SomeObject *>(&(*similarObject)); 

điểm làm địa chỉ của một con trỏ dereferenced là gì? Liệu con trỏ không phải là địa chỉ của nó?

+7

Tương tựKhông có con trỏ thông minh? Kỹ thuật này đôi khi được sử dụng để lấy tham chiếu của một con trỏ thô, khi * đã bị quá tải. – DanDan

+0

Có phải dereference và địa chỉ của toán tử có quá tải không? –

+3

@DanDan: Đặt câu trả lời này là một câu trả lời. –

Trả lời

32

Có thể là loại similarObject đã quá tải operator* và do đó, nó trả lại nội dung có địa chỉ bạn đang chuyển đến dynamic_cast.

&(*x)xcó thể không phải luôn giống nhau. Ví dụ, suy nghĩ của iterator:

std::map<int, int>::iterator it = v.begin(); 

Sau đó it&(*it) hai điều khác nhau:

  • Loại itstd::map<int, int>::iterator
  • Loại &(*it)std::pair<int,int>*

Chúng là không phải giống nhau. Điều tương tự cũng có thể xảy ra với đoạn mã của bạn.

+1

Đôi khi tôi sử dụng '& * v.begin()' thay vì '& v [0]' để đưa con trỏ đến phần đầu của 'std :: vector'. –

+1

@ Alexandre: Trong trường hợp đó, tôi thấy '& v [0]' dễ hiểu, và vì vậy tôi thích nó hơn '& * v.begin()'. – Nawaz

+0

Tôi đã từng tìm '& v [0]' dễ dàng hơn, nhưng không còn nữa. Vị thành niên thay đổi theo thời gian. –

17

Nếu tương tựObject là một con trỏ thông minh, kỹ thuật này đôi khi được sử dụng để lấy tham chiếu của con trỏ thô, khi * đã bị quá tải.

+2

'auto_ptr' và các con trỏ thông minh Boost và tr1 đều có chức năng này,' .get() ' –

1

Không ai được đề cập đến là similarObject là một giá trị, trong khi &*similarObject là một giá trị.

+0

' & * similarObject' KHÔNG cần phải là một giá trị. Nó cũng có thể là một giá trị. – Nawaz

+1

@Nawaz: Chỉ khi bạn quá tải toán tử '&' đơn nhất để trả về tham chiếu. Đó là điều mà bạn tuyệt đối không nên làm. – fredoverflow

Các vấn đề liên quan