There are two main methods to find a Bezier curve intersection:
- Recursive subdivision exploits the convex hull property of Bezier curves and usually checks the intersection of bounding boxes of its curve segments.
Code from book Graphics Gems IV with some textual description
- Numerical solution of the system of two cubic equations. It leads to a polynomial equation of the 9th order and may have 9 real roots (case of two S-shaped curves). Note that the solution is numerically unstable.
JS code and interactive demonstration
And I think C++ code might be in Geometric Tools WildMagic library.