@dig_marian:

Alguien dijo una vez que un buen programador nunca debe saber solamente un lenguaje, si no varios. Y es verdad. Aunque sean nociones siempre viene bien saber de otros lenguajes, tú creo que ya tienes esas nociones. Centrarse en un lenguaje es bueno para perfeccionarse, pero también es bueno tener otras opciones. Cada cual tiene sus usos más concretos, pero por norma general hay veces que C++ no se suele usar para según que cosas y lo mismo pasa con C#/Java.

Te pongo el ejemplo, cuando quieres hacer un programita con entorno gráfico que haga ciertas cosas, como por ejemplo conectarse a una web, mostrar algún tipo de gráfico o tratar con bases de datos, lo normal en Windows es usar C# haciendo uso del framework .NET, el cual te lo da casi todo ya mascadito. Yo no conozco Java más que de ver código y de pasada, pero el lenguaje y conceptos son prácticamente idénticos, salvando las diferencias de algunas palabras clave y las librerias. Por lo general lo que puedas hacer en uno se podrá hacer en el otro. Aunque sea de forma distinta.

C# no es una mala opción para empezar, es una sintaxis más "limpia" y amigable que C++. Visual Studio para mí es de lo mejor que tiene Msoft, es muy fácil de usar. Pero aparte de eso el framework tiene casi todo lo que necesitas. El problema es que estás enfocado a plataformas Windows. C# tiene una alternativa multiplataforma que se llama Mono. El lenguaje es el mismo y la libreria, aunque no se exactamente (no lo he probado) lo extensa que es, supongo que tendrá bastantes cosas. Digamos que Mono es el Java de C#, por el hecho de ser multiplataforma.

C++ aunque es un lenguaje que evoluciona constantemente, siendo de más bajo nivel que C# y Java yo pienso que sus usos se relegan a cosas diferentes en vez de a la productividad (facilidad y rapidez para implantar tareas, ventajas de C#/Java) . Su librería estándar no es tan extensa como Java o C#, aunque por el contrario al ejecutarse en modo nativo tiene un mayor rendimiento en general. Digamos que es un lenguaje donde hay que recurrir más a librerías externas y aparte está el tema de la administración de recursos (memoria). En C#/Java tienes un recolector de basura, tú puedes ir tranquilamente creando objetos/variables que el GB (Garbage Collector) ya se encargará de limpiar la basura. Salvando en casos extremos donde el GB afecta gravemente al rendimiento, para la mayoría de las aplicaciones esto no implica un impacto serio o notable en el rendimiento de tu programa. C++ no tiene GB (de momento) y la administración de memoria la tienes que controlar tú. El acceso a la memoria es directo, además es muy fácil cagarla y provocar una fuga de memoria (memory leak) haciendo que tu programa se dispare en consumo de RAM.

En cualquier caso el futuro de C++ es prometedor pues con la versión C++11 y la inminente C++14 aparte de novedosas ventajas hay sistemas para no tener que preocuparte tanto de estos problemas con la gestión de memoria.

De Java mejor que opinen otros, pero creo que la historia ha hablado sola sobre este lenguaje y es una opción muy recomendable, especialmente si buscas soportar multiples plataformas.

Cualquiera de los tres es un buen lenguaje para orientación a objetos. Con cualquiera de los tres podrás aprender bien los conceptos, pero si buscas productividad inmediata, sin duda Java y C# .NET tienen obvias ventajas. C++ no es mala opción como lenguaje pero no te da esas facilidades de entrada.