Что означает "<<" и ">>" в С++ для 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

Они часто перегружаются и используются для потоков. & Л; < фактически является оператором сдвига лева. → фактически является оператором правого сдвига.