Простите меня, возможно, задав довольно простой вопрос, но что фактически означает оператор вставки и делает в программе? (например, cout <<
/cin >>
)
Что означает "<<" и ">>" в С++ для cout/cin?
Ответ 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
Ответ 2
Они являются операторами побитового сдвига (<<
- сдвиг влево, >>
- сдвиг вправо). Они также обычно перегружаются как потоковые операторы (<<
тогда означает поток, поток >>
) - с типом потока с левой стороны (например, std::ostream
или std::istream
) и любым другим типом с правой стороны.
Ответ 3
Он пишет или читает объекты;
std::cout << 5; // writes the integer 5 to the standard output
int x;
std::cin >> x; // reads an integer from the standard input
Он перегружен для всех стандартных типов.
И большинство людей переопределяют их для собственных пользовательских типов.
Примечание. Левая часть оператора может быть любым типом потока (например, std:: fstream или std:: stringstream), поэтому он становится обобщенным механизмом сериализации объектов.
Ответ 4
< < и → - простые операторы, как +, -, =, ==, + =,/= и т.д., вы получаете упражнение. Это означает, что это зависит от объекта/структуры, с которой вы его используете. С cout и cin это операторы чтения/записи, но вы можете перегрузить оператора, чтобы сделать что-то совершенно другое.
class myclass {
int x;
myclass operator << ( int a ) {
x += a;
}
}
Теперь я не говорю, что кто-то должен это делать, но это приведет к добавлению, если вы будете использовать объект myclass с этим оператором. Итак, как вы можете видеть: что вы делаете с "< <" или " → " зависит от того, как оператор перегружен.
Ответ 5
Они часто перегружаются и используются для потоков. & Л; < фактически является оператором сдвига лева. → фактически является оператором правого сдвига.