2013-09-05 4 views
-3

У std::basic_ostream есть перегрузка operator << Что касается предмета std::basic_string? Я читаю cppreference, и, похоже, ни один из них не указан.Как std :: cout печатает std :: string?

+12

Это в '': http://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt –

+2

... что имеет смысл, так как именно там вы, вероятно, поместили бы переопределение ввода для пользовательского класс * вы * проектировали; в его заголовочном файле. Однако базовые типы и потоковые буферы связаны с 'basic_ostream', как и должно быть. – WhozCraig

ответ

3

В пространстве имен std определены операторы, не являющиеся членами. См. cppreference.

+0

«глобально» в пространстве имен 'std' :) (http://en.cppreference.com/w/cpp/header/string) –

+0

Нет, действительно, вам следует отредактировать ответ. Оператор 'std :: << << не совпадает с глобальным' operator << '. –

4

Представьте, что вы создали свой собственный класс под названием Car, который содержит номерные знаки, модель/мощность двигателя и кучу другой информации. Теперь представьте, что вы хотите предоставить хороший способ распечатать информацию о вашем автомобиле в файле или на экране.

Если вы хотите использовать перегрузку basic_ostream, вам не повезло, так как нет перегрузки для вашего класса. Вы можете предоставить метод print_into_ostream или какой-нибудь другой умный трюк, но вы только что поняли, что std::string также не имеет соответствующей перегрузки, и вы все еще можете сделать cout << myStr;. После быстрого поиска, вы найдете решение, которое применяется в std::string, и вы можете использовать его в своем классе, как это:

class Car 
{ 
    std::string licence_plate, engine; 
public: 
    // ... other here ... 
    friend ostream& operator<<(ostream& os, const Car& c); 
}; 

ostream& operator<<(ostream& os, const Car& c) 
{ 
    os << c.licence_plate << "-" << c.engine; 
    return os; 
} 

И теперь вы можете использовать

cout << myCarObject << endl; 

, как с любым встроенным в типе.

std::string использует тот же подход, и вы можете найти документацию here.

0

Если вы хотите распечатать объект вашего class A, вы перегружать << operator так:

ostream & operator << (ostream & os, A &a) 
{ 
    os << a.data_member; 
} 

Таким же образом в std namespace есть перегруженный оператор, который печатает объект класса string.

+0

Вероятно, 'A' должен быть' const', а функция должна возвращать 'os'. –