Ответ 1
Это зависит от того, как вы его перегружаете для своего класса.
-
В случае
std::cout
<<
используется для записи в стандартный вывод.>>
не перегружен дляstd::cout
. Так чтоstd::cout >> x
выдаст ошибку компиляции. -
В случае
std::cin
>>
используется для чтения из стандартного ввода.<<
не перегружен дляstd::cin
. Так чтоstd::cin << x
выдаст ошибку компиляции. -
Для вашего пользовательского класса вы можете перегрузить
<<
или>>
, или оба, и в функции вы можете делать все что угодно. Например, в следующем коде я перегружаю<<
дляstd::vector<T>
чтобы добавить элементы в вектор,template<typename T> std::vector<T> & operator<<(std::vector<T> & v, T const & item) { v.push_back(item); return v; }
Теперь я могу использовать эту перегрузку, чтобы написать это:
std::vector<int> v; v << 1 << 2 << 3 << 4 << 5; //inserts all integers to the vector!
Все целые числа добавляются в вектор! Смотрите онлайн демо: http://ideone.com/TsqtS
Аналогично, мы можем перегрузить
>>
дляstd::vector<T>
чтобы распечатать все элементы в нем как: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 >> std::cout; //crazy!
Демо онлайн: http://ideone.com/BVSm7
Дело в том, что вы можете перегружать эти операторы любым удобным для вас способом. Насколько сумасшедшими или вменяемыми будут выглядеть перегрузки и их использование - решать только вам. Например, синтаксис v >> std::cout
выглядел бы безумным для большинства программистов, как я полагаю. Лучшая и, вероятно, нормальная перегрузка была бы для std::ostream
как:
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;
}
Теперь вы можете написать это:
std::cout << v << std::endl; //looks sane!
Демо: http://ideone.com/jce2R