Почему при выводе:
cout<<(5<<3);
На экран выводится 40.
Потому, что эта запись означает.
1) Сдвинуть двоичную запись числа 5 на три разряда влево.
2) Вывести результат на экран
Двоичная запись числа 5, это 101 Сдвигаем влево на три разряда 101000 = 40
В языке C++ встроенная операция сдвига влево E1 << E2 для беззнаковых целых типов и положительных значений знаковых целых типов определяется через операцию умножения сдвигаемого значения на 2E2, Таким образом 5 << 3 по определению равно 5 * 8, то есть 40.
Потому что << — это всего лишь функция с именем operator<<, которую можно перегружать как угодно и с какими угодно целями.
Для int определена перегрузка вида int ::operator<<(int val, size_t offset), выполняющая побитовый сдвиг влево. Аналогичные перегрузки есть для всех встроенных числовых типов данных.
std::ostream определяет свою перегрузку, std::ostream& std::ostream::operator<<(T val), выполняющую вывод строкового представления val в поток. Да, именно строкового, поскольку единственная задача istream и ostream — форматированный ввод/вывод. Для всего остального есть std::streambuf.
Из всего вышесказанного можно сделать два вывода:
Смысл перегрузки и типы аргументов и возвращаемого значения компилятору неважны и оставляются на усмотрение программиста. Единственное, что фиксировано — имя функции (operator<<) и количество аргументов (2).
operator<< может быть не только функцией, но и методом класса. Тогда то, что находится слева от оператора, передаётся в качестве this.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости