2010-05-25 27 views
5

tôi thấy mã này, nhưng tôi không thể hiểu những gì nó làm:quá tải -> điều hành trong C++

inline S* O::operator->() const 
{ 
    return ses; //ses is a private member of Type S* 
} 

vì vậy những gì sẽ xảy ra bây giờ nếu tôi sử dụng ->?

+0

BTW, đây là C++ chỉ khi ngôn ngữ C không cho phép chức năng hoặc toán tử quá tải. Đây là một vấn đề khác phân biệt hai ngôn ngữ. –

Trả lời

2

là bạn có một thể hiện của lớp O và bạn làm

obj->func() 

thì nhà khai thác> trả về ses và sau đó nó sử dụng con trỏ trở về gọi func().

Full dụ:

struct S 
{ 
    void func() {} 
}; 

class O 
{ 
public: 
    inline S* operator->() const; 
private: 
    S* ses; 
}; 

inline S* O::operator->() const 
{ 
    return ses; 
} 

int main() 
{ 
    O object; 
    object->func(); 
    return 0; 
} 
+1

điều gì xảy ra nếu func() của S được khai báo là: void void func() = 0; – hero

+0

chức năng ảo ít nhất phải được bảo vệ, nhưng tốt nhất là riêng tư. Đó là trách nhiệm của lớp S để đảm bảo rằng ses đang trỏ đến một đối tượng hợp lệ. –

+0

chức năng riêng ảo? Trừ khi bạn có đầy đủ các khai báo lớp bạn bè, tôi nghĩ rằng riêng tư và ảo chủ yếu là loại trừ lẫn nhau. – luiscubal

0

Đó là toán tử bị quá tải sẽ trả lại con trỏ tới một số thành viên thuộc loại S.

Giống như, nếu bạn viết

O object; 
(object->)... 

phần (object->) sẽ trở thành con trỏ của bạn.

-1

Nó quá tải toán tử -> của lớp O, mà trả bây giờ là một S * thay vì một O *

+3

Theo mặc định, lớp O không có toán tử -> trả về một O *. –

0

Bất cứ lúc nào một đối tượng kiểu O sử dụng -> điều hành một con trỏ đến ses sẽ được trả lại.

11

Bây giờ nếu bạn có

O object; 
object->whatever() 

đầu tiên quá tải operator-> sẽ được gọi, mà sẽ trở lại ses được lưu trữ bên trong đối tượng, sau đó operator-> (built-in trong trường hợp S*) sẽ được gọi lại cho con trỏ trả về.

Vì vậy

object->whatever(); 

tương đương với giả:

object.ses->whatever(); 

sau này sẽ là tất nhiên không thể vì O::sesprivate - đó là lý do tại sao tôi gọi nó giả.

Với quá tải như vậy bạn có thể tạo trình bao bọc xung quanh con trỏ - trình bao bọc như vậy thường được gọi là con trỏ thông minh.

+0

"Với quá tải suce" => Ý của bạn có phải là "chẳng hạn" hoặc là "suce" tên của toán tử '->' không? (hỏi tiếng mẹ đẻ không phải tiếng mẹ đẻ) – ereOn

+0

@ereOn: Đã sửa lỗi, đó là lỗi chính tả. – sharptooth

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