Note that the storage type of a string in C and C++ is char* or char[]. That is, a string in C or C++ is just an array of characters (pointers and arrays in C/C++ are essentially the same).
When you do "ab"+'a', "ab" is compiled to a pointer to a fixed string somewhere in memory, and 'a' is compiled to the integer of its ascii value (96). The "ab" is then a pointer to the location of the string in memory, and when you do "ab"+'a', the result is a pointer to the location 96 bytes after the start of your string. The cout then tries to print whatever data is at that location, which in this case is unprintable.