Pues mira, todo depende de la API que quieras usar y para que sistema programar.
Para empezar, en C++ si programas un programa de escritorio para Windows no te va a servir para Linux (a menos que uses wine) ni para Mac, por que son API's diferentes, y no va a funcionar. El lenguaje Java sin embargo te da la opción de crear una interfaz multiplataforma, lo que programes en Java va a funcionar en muchísimos dispositivos, todos los ordenadores y algunos dispositivos portátiles, pero tienen que tener Java instalado, sino no funcionarán.
Eso es en lo que caigo ahora mismo respecto a entornos gráficos de sistemas operativos, ahora bien, tu puedes crearte el tuyo propio.
Por ejemplo, en mi caso, yo mismo soy el que se ha programado los botones, los inputbox y todo eso, usando una libreria gráfica llamada SDL, que es multiplataforma, y por tanto eso si va a ser una solución para todos los sistemas operativos. Pero hay que decir que es un coñazo, y que si no es para programar una solución gráfica (como un juego, en mi caso) no te conviene hacer esto, porque es una larga tarea.
En fin, mi consejo es que practiques con un solo sistema operativo primero (yo probé con windows, pero puedes usar el que quieras) si te apetece probar con Linux tambien puedes, pero recuerda que tienes dos opciones: la interfaz de GNOME y la interfaz de KDE, aunque creo que existen soluciones que funcionan en todas las plataformas Linux, pero ya te digo, nunca he programado eso.
De todas formas, busca información sobre esas API's y como usarlas, mira:
GUI Windows
http://www.rohitab.com/discuss/index.php?showtopic=11408http://www.winprog.org/tutorial/start.htmlhttp://www.dreamincode.net/forums/index.php?app=core&module=attach§ion=attach&attach_id=2635GUI GNOME C++
http://www.gtkmm.org/documentation.shtmlSaludos!