I know that indexing operator implementations usually return references so that the values can be set as well as retrieved, but why do streams?
So you can chain them together.
cout << "hello" << "how are you";
Works because cout << "hello" returns a reference to the cout so that << "how are you" knows there to put itself.
cout << "hello"
<< "how are you"
Most operators, such as +=, also do this.
+=