Computer >> Máy Tính >  >> Lập trình >> C ++

Là gì? ->? toán tử trong C ++?


Không có toán tử nào như vậy trong C ++. Đôi khi, chúng ta cần tạo các loại trình bao bọc. Ví dụ:các loại như unique_ptr, shared_ptr, tùy chọn và tương tự. Thông thường, các loại này có một hàm thành viên của trình truy cập được gọi là .get nhưng chúng cũng cung cấp toán tử → hỗ trợ truy cập trực tiếp đến giá trị được chứa tương tự như những gì con trỏ thông thường làm.

Vấn đề là đôi khi chúng ta có một vài kiểu này được lồng vào nhau. Điều này có nghĩa là chúng ta cần gọi .get nhiều lần hoặc có nhiều toán tử tham chiếu cho đến khi chúng ta đạt được giá trị.

Cái gì đó như thế này -

wrapper<wrapper<std::string>> wp;
wp.get().get().length();
wp.get()->length();

Điều này có thể là một chút xấu xí. Nếu chúng ta có thể thay thế một .get () bằng một mũi tên, sẽ rất tuyệt nếu chúng ta cũng có thể thay thế .get () thứ hai. Đối với điều này, C ++ 98 đã giới thiệu toán tử mũi tên dài.

wrapper<wrapper<std::string>> wp;
wp--->length();

Điều gì sẽ xảy ra nếu chúng ta có một lớp gói khác? Chỉ cần tạo một mũi tên dài hơn.

wrapper<wrapper<wrapper<std::string>>> wp;
wp----->length();

Mũi tên dài không phải là một toán tử đơn lẻ mà là sự kết hợp của nhiều toán tử. Trong trường hợp này, toán tử bình thường -> và toán tử giảm dần hậu tố -.

Vì vậy, khi chúng ta viết wp ---- → length (), trình biên dịch sẽ thấy ((wp -) -) → length ().

Nếu chúng ta xác định hậu tố - giống với toán tử tham chiếu, chúng ta sẽ nhận được mũi tên dài và các toán tử mũi tên thậm chí còn dài hơn -

template <typename T>
class wrapper {
   public:
   T* operator->()    { return &t; }
   T& operator--(int) {  return t; }
   private:
   T t;
};