2011-10-13 86 views

Trả lời

1

Nó viết hoặc đọc các đối tượng;

std::cout << 5; // writes the integer 5 to the standard output 

int x; 
std::cin >> x; // reads an integer from the standard input 

Nó bị quá tải cho tất cả các loại tiêu chuẩn.
Và hầu hết mọi người ghi đè chúng cho các loại được xác định bởi người dùng của riêng họ.

Lưu ý: Phía bên trái của toán tử có thể là bất kỳ loại luồng nào (chẳng hạn như std :: fstream hoặc std :: stringstream) để nó trở thành một cơ chế tổng quát cho việc tuần tự hóa các đối tượng.

10

Nó phụ thuộc vào cách bạn quá tải nó cho lớp học của bạn.

  • Trong trường hợp std::cout, << được sử dụng để ghi vào đầu ra tiêu chuẩn. >> không bị quá tải cho std::cout. Vì vậy, std::cout >> x sẽ cung cấp lỗi biên dịch.

  • Trong trường hợp std::cin, >> được sử dụng để đọc từ đầu vào tiêu chuẩn. << không bị quá tải cho std::cout. Vì vậy, std::cin << x sẽ cung cấp lỗi biên dịch.

  • Đối với lớp tùy chỉnh, bạn có thể quá tải << hoặc >> hoặc cả hai và trong chức năng bạn có thể làm bất cứ điều gì bạn muốn. Ví dụ, trong đoạn mã sau, tôi quá tải << cho std::vector<T> để thêm các yếu tố để vector,

    template<typename T> 
    std::vector<T> & operator<<(std::vector<T> & v, T const & item) 
    { 
         v.push_back(item); 
         return v; 
    } 
    

    Bây giờ tôi có thể sử dụng quá tải này để viết này:

    std::vector<int> v; 
    v << 1 << 2 << 3 << 4 << 5; //inserts all integers to the vector! 
    

    Tất cả các số nguyên sẽ được thêm vào vector! Xem demo trực tuyến: http://ideone.com/TsqtS

    Tương tự như vậy, chúng ta có thể quá tải >> cho std::vector<T> để in tất cả các mục trong nó như:

    template<typename T> 
    std::vector<T> & operator>>(std::vector<T> & v, std::ostream & out) 
    { 
        for(size_t i = 0 ; i < v.size(); i++) 
         std::cout << v[i] << std::endl; 
        return v; 
    } 
    

    Và bây giờ chúng ta có thể in các vector như:

    v >> std::cout; //crazy! 
    

    trực tuyến bản trình diễn: http://ideone.com/BVSm7

Vấn đề là bạn có thể quá tải các toán tử này theo bất cứ cách nào bạn muốn. Làm thế nào điên hoặc sane quá tải và cách sử dụng của họ sẽ là tùy thuộc vào bạn. Ví dụ, cú pháp v >> std::cout sẽ trông điên rồ với hầu hết các lập trình viên, như tôi đoán.Một tình trạng quá tải tốt hơn và có lẽ lành mạnh sẽ cho std::ostream như:

template<typename T> 
std::ostream & operator << (std::ostream & out, const std::vector<T> & v) 
{ 
     for(size_t i = 0 ; i < v.size(); i++) 
     out << v[i] << std::endl; 
     return out; 
} 

Bây giờ bạn có thể viết này:

std::cout << v << std::endl; //looks sane! 

Demo: http://ideone.com/jce2R

+0

quá tải nhà điều hành có danh tiếng đủ xấu. Cho phép không khuyến khích lạm dụng của nó. Sử dụng của nó cho streaming cũng được thành lập ở trên chỉ là sẽ gây nhầm lẫn một người duy trì (vì nó là như vậy tắt nhịp từ bình thường). –

+1

@LokiAstari: lạm dụng này như thế nào? Bất kỳ ai quen thuộc với cách sử dụng của nó để phát trực tuyến sẽ nhận ra những gì các mã trên không. Hầu hết các container Qt đều hoạt động theo cách đó và tôi sử dụng nó rất nhiều vì nó làm cho mã dễ bảo trì và dễ đọc hơn. – pezcode

+0

@LokiAstari: Tôi biết. đó là những gì tôi đang giải thích trong bài đăng của tôi, với nhiều loại quá tải khác nhau. – Nawaz

0

Họ thường quá tải và sử dụng cho các dòng. < < thực sự là một toán tử thay thế lef. >> thực sự là một nhà điều hành dịch chuyển đúng.

2

Chúng là các toán tử dịch chuyển bit (<< là dịch chuyển sang trái, >> là dịch chuyển sang phải). Chúng cũng thường bị quá tải như các toán tử phát trực tiếp (<< sau đó có nghĩa là luồng ra, >> luồng) - với loại luồng ở bên trái (ví dụ: std::ostream hoặc std::istream) và bất kỳ loại nào khác ở bên phải.

0

< < và >> là các toán tử đơn giản, giống như +, -, =, ==, + =,/= v.v., bạn nhận được máy khoan. Điều đó có nghĩa là, nó phụ thuộc vào đối tượng/cấu trúc bạn đang sử dụng nó. Với cout và cin, đây là các toán tử đọc/ghi, nhưng bạn có thể quá tải toán tử để làm điều gì đó hoàn toàn khác.

class myclass { 
    int x; 
    myclass operator << (int a) { 
     x += a; 
    } 
} 

Bây giờ, tôi không nói ai nên làm điều này, nhưng điều này sẽ dẫn đến việc bổ sung nếu bạn sử dụng đối tượng myclass với toán tử này. Vì vậy, như bạn có thể thấy: Những gì bạn làm với "< <" hoặc ">>" phụ thuộc vào cách toán tử bị quá tải.

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