У std::basic_ostream
есть перегрузка operator <<
Что касается предмета std::basic_string
? Я читаю cppreference, и, похоже, ни один из них не указан.Как std :: cout печатает std :: string?
ответ
В пространстве имен std
определены операторы, не являющиеся членами. См. cppreference.
«глобально» в пространстве имен 'std' :) (http://en.cppreference.com/w/cpp/header/string) –
Нет, действительно, вам следует отредактировать ответ. Оператор 'std :: << << не совпадает с глобальным' operator << '. –
Представьте, что вы создали свой собственный класс под названием 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.
Если вы хотите распечатать объект вашего class A
, вы перегружать << operator
так:
ostream & operator << (ostream & os, A &a)
{
os << a.data_member;
}
Таким же образом в std namespace
есть перегруженный оператор, который печатает объект класса string
.
Вероятно, 'A' должен быть' const', а функция должна возвращать 'os'. –
Это в '': http://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt –
... что имеет смысл, так как именно там вы, вероятно, поместили бы переопределение ввода для пользовательского класс * вы * проектировали; в его заголовочном файле. Однако базовые типы и потоковые буферы связаны с 'basic_ostream', как и должно быть. – WhozCraig