C2char& operator + ( ... )

これはまずいですね。この関数は内部でローカルなオブジェクトを生成して,
そのリファレンスを返していますが,そのオブジェクトは
関数を抜けた瞬間,残念ながら
c3 = c1 + c2;
c3 にコピーされる前に破棄されます。

C2char operator + ( ... )

にするべきです。