2017-01-07 18 views
0

Как мой учитель учил, я использовал для реализации оператора < < вреализации оператор << право

ostream &operator<<(ostream &out, const MyClass &c) 
{ 
    cout << someVariables; 
    return out; 
} 

Но я понял, мы получаем в ostream объект, почему woldn't мы используем это? Я попробовал и это сработало:

ostream &operator<<(ostream &out, const MyClass &c) 
{ 
    out << 123; 
    return out; 
} 

что я должен использовать? в чем преимущества каждого из них?

+0

Первый будет ** всегда ** печатать на 'cout', даже если вы используете другой поток. Второй будет печатать в предоставленном потоке. Подумайте о чем-то вроде 'aStream << MyClass()'. –

+3

Зачем вам нужно 'some_stream_that_is_not_cout << some_object' писать в' cout'? \ – Peter

+4

Преимущество второго заключается в том, что, в отличие от первого, это не совсем неправильно. – molbdnilo

ответ

-2

В первом примере мы определяем логику, которая будет использоваться, если ostream и MyClass являются операндами оператора <<. То есть, если кто-то должны были пойти

MyClass foo; cout << foo;

Тогда это будет выглядеть для перегрузки оператора для типов ostream для соиЬ и типа MyClass. Вы легко могли бы просто пойти cout << foo.getSomeProperty(), но если вы сделали это в нескольких местах, и вы хотели изменить функциональность, то внесение этих изменений означало бы изменение нескольких операторов, а не просто внесение изменений в одно место (а именно: вы определяете перегрузку оператора).

+0

Проблема в том, что происходит, когда вы пишете 'outstream out (« myfile.txt »); из << Foo; '. Первая форма оператора будет записываться на консоль, а не в файл. –