2010-03-18 60 views

Trả lời

12

Vì bạn đang yêu cầu trong nhận xét. Những gì bạn có thể tìm cho có thể được tìm thấy trong các tiêu chuẩn (5.2.5 Lớp truy cập thành viên):

3 Nếu E1 có kiểu “con trỏ đến lớp X”, thì biểu thức E1-> E2 là được chuyển đổi sang dạng tương đương (* (E1)). E2;

Trình biên dịch sẽ tạo ra cùng một hướng dẫn chính xác và nó sẽ hiệu quả. Máy của bạn sẽ không biết nếu bạn đã viết "->" hoặc "*.".

+0

Đúng. Đó là những gì tôi đang tìm kiếm - cho dù chúng có giống nhau hay không. – Rachel

15

[Chỉnh sửa]

Nếu biến được định nghĩa là T * (trong đó T là một số loại) sau đó cả hai -> và * đều giống nhau (trừ khi ptr là null).

Nếu biến là một thể hiện của một lớp (theo giá trị hoặc tham chiếu) thì -> và * sẽ hoạt động giống nhau (theo thực hành tốt nhất), nhưng điều này yêu cầu lớp quá tải chúng theo cùng một cách.

+1

-> và * không hoạt động trên chính loại T, nhưng trên một loại T *, là con trỏ. –

+8

Nếu lớp cơ bản * làm * quá tải '->' hoặc '*', nó sẽ quá tải cả hai để nó vẫn như cũ. Nếu không nó được thiết kế tồi. –

+0

@Brian '->' và '*' hoạt động trên bất kỳ thứ gì định nghĩa toán tử 'operator->' và '*'. * Và * cũng trên tất cả các loại con trỏ. –

7

Toán tử -> đặc biệt ở chỗ trong hầu hết các trường hợp, nó "khoan xuống" đệ quy cho đến khi kết quả biểu thức không còn là thứ có toán tử quá tải được định nghĩa cho nó. Khái niệm (*subxpression).x chỉ làm một dereference trên subexpression, vì vậy nếu kết quả của (*subexpression) là con trỏ khác, thì điều này sẽ không biên dịch (bạn sẽ cần phải viết (*(*subexpression)).x Xem đoạn mã sau cho một minh họa tốt hơn:.

#include <iostream> 
using namespace std; 

class MyClass 
{ 
public: 
    MyClass() : x(0) {} 
    int x; 
}; 

class MyPtr 
{ 
private: 
    MyClass* mObj; 
public: 
    MyPtr(MyClass* obj) : mObj(obj) {} 
    MyClass* operator->() 
    { 
     return mObj; 
    } 
}; 

int main() 
{ 
    MyClass obj; 
    MyClass* objCPtr = &obj; 
    MyClass** objCHandle = &objCPtr; 
    MyPtr ptr(&obj); 
    cout << ptr->x << endl; 
    cout << (*(*objCHandle)).x << endl; 
} 

Tuy nhiên lưu ý, rằng điều này sẽ không biên dịch:.

cout << objCHandle->x << endl; 

Bởi vì khoan xuống hành vi của -> chỉ xảy ra khi phía bên tay trái của biểu thức là một lớp, struct, công đoàn, hoặc loại generic trong trường hợp này, objCHandle là MyClass **, vì vậy nó không đủ điều kiện.

+1

@Jeremy: Tôi đã thêm một số backticks, để ngăn các dấu hoa thị không được hiểu là lệnh định dạng :). –

+0

@Andrew: cảm ơn! –

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