Most can be overloaded. The only C operators that can't be are "." and "?:" (and "sizeof", which is technically an operator). C++ adds a few of its own operators, most of which can be overloaded except "::" and ".*".
Here's an example of the subscript operator (it returns a reference): (First conditional clauses are without operator overloading.)
class Array { public: #if 0 int& elem(unsigned i) { if (i>99) error(); return data[i]; } #else int& operator[] (unsigned i) { if (i>99) error(); return data[i]; } #endif private: int data[100]; }; main() { Array a; #if 0 a.elem(10) = 42; a.elem(12) += a.elem(13); #else a[10] = 42; a[12] += a[13]; #endif }