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 ->
?
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 ->
?
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;
}
điều gì xảy ra nếu func() của S được khai báo là: void void func() = 0; – hero
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ệ. –
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
Đó 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.
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 *
Theo mặc định, lớp O không có toán tử -> trả về một O *. –
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.
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::ses
là private
- đó 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.
"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
@ereOn: Đã sửa lỗi, đó là lỗi chính tả. – sharptooth
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ữ. –