¡Advertencia!
Este tema no ha tenido respuestas en más de un mes. Recuerda que si deseas añadir una nueva debes cumplir con las normas de la web.
Quise fortalecer mis conocimientos de C intentando programar ahora en C++. Estoy viendo que es posible utilizar la librería <stdio.h> en C++, pero miro en tutoriales que suelen utilizar <iostream> y colocan using namespace std; (que desconozco totalmente qué significa esto en C++, ya que nunca lo vi en C).

¿Cuál es la diferencia entre stdio.h y iostream al menos en C++? Utilizo más stdio.h porque me gusta más imprimir con printf, ingresar datos con scanf, etc...

¿Hay alguna ventaja en utilizar iostream en C++? ¿La eficiencia del programa es mejor? ¿cout supera a printf y cin a scanf o algo así?

Saludos
La librería estándar de C con las funciones de entrada y salida de consola (scanf, printf, perror, etc) es stdio.h, mientras que la librería estándar para C++ para el mismo propósito es la librería iostream, con clases de entrada y salida de consola (cin, cout, cerr, etc).

Puedes utilizar la librería stdio.h en C++ incluyendo el nombre de librería cstdio, mientras que no puedes utilizar la librería de clases iostream en C. La diferencia de costes temporales entre usar las clases de iostream y las funciones de cstdio en C++ es mínima e inapreciable, de apenas milisegundos. Lo recomendable en C++ es utilizar la librería iostream por convenio ya que utiliza implícitamente las funciones de entrada y salida de C, pero solo si vas a necesitar estrictamente la librería cstdio en tu programa, puedes incluirla sin problemas.


Después, respondiendo a tu otra duda, un problema que tenía C es que solo podías trabajar con un único espacio de nombres. Con esto me refiero a que, si desarrollabas un programa bastante extenso en C, podía ocurrir en un momento determinado que te podías "quedar sin nombres nuevos" para nuevas entidades de funciones o variables, pudiendo llegar a provocar colisiones entre funciones ya definidas (obviamente la única forma de superar este problema era colocarle algún sufijo o prefijo a dichas variables o funciones para poder distinguirlas, por ejemplo: imprimeModulo1, imprimeModulo2, etc).

Sin embargo, en C++ una forma más cómoda (y una práctica más recomendada) de resolver este problema es utilizar más de un espacio de nombres con la palabra reservada namespace, para envolver un conjunto de entidades de clases y objetos en un espacio de nombres determinado y así evitar colisiones de nombres de entidades o identificadores homónimos. Luego podías invocar dichas funciones o variables con el símbolo de alcance de C++, que es: "::". Esto lo podrás encontrar también en otros lenguajes de programación imperativa y/u orientada a objetos, como Java, Python, PHP, Perl, etc.

Para que te hagas una idea menos abstracta: mientras que en C solo tenías una bolsa donde podías guardar todos los nombres de las variables y de las funciones de tu programa, en C++ puedes ponerle el mismo nombre a distintas funciones, variables, clases u objetos siempre y cuando los clasificaras en distintas bolsas, es decir, distintos conjuntos de nombres para evitar esas colisiones de nombres que habíamos hablado que en C podían suceder.

Por ejemplo:
#include <iostream>

namespace espacioA
{
   int hacerAlgo()
   {
      std::cout << "Estoy dentro del espacio de nombres A" << std::endl;
      return 0;
   }
}

namespace espacioB
{
   int hacerAlgo()
   {
      std::cout << "Estoy dentro del espacio de nombres B" << std::endl;
      return 1;
   }
}

int main ()
{
   espacioA::hacerAlgo();   // Invocará a la función "hacerAlgo" dentro del espacio de nombres "espacioA". 
   espacioB::hacerAlgo();   // Invocará a la función "hacerAlgo" dentro del espacio de nombres "espacioB".

   return 0;
}


Si te das cuenta, detrás de cada invocación a la función cout, hemos colocado un std:: detrás. ¿Por qué? Porque dichas funciones de iostream están dentro del espacio de nombres "std" definido en esa misma librería. Si no colocamos ese std:: detrás, nos devolverá error el compilador porque no sabrá de dónde sale cout, cin, cerr, endl y demás funciones estándar de iostream. Sin embargo, con la directiva using namespace std estaremos indicando que queremos que el programa utilice todas las declaraciones del espacio de nombres "std", lo que quiere decir que usaremos todos los objetos y funciones del espacio de nombres std, por lo que cada invocación a las funciones estándar cout, cin, cerr, etc se realizarán de forma implícita en el código:

#include <iostream>
using namespace std;

namespace espacioA
{
   int hacerAlgo()
   {
      cout << "Estoy dentro del espacio de nombres A" << endl;
      return 0;
   }
}

namespace espacioB
{
   int hacerAlgo()
   {
      cout << "Estoy dentro del espacio de nombres B" << endl;
      return 1;
   }
}

int main ()
{
   espacioA::hacerAlgo();   // Invocará a la función "hacerAlgo" dentro del espacio de nombres "espacioA". 
   espacioB::hacerAlgo();   // Invocará a la función "hacerAlgo" dentro del espacio de nombres "espacioB".

   return 0;
}


Este código hará exactamente lo mismo que el anterior.

Perro viejo de Habbo y de HabboStium. Y lo mismo en la vida real, pero sin el "perro".
Gracias, explicación mejor que cualquiera de internet.
Alex, gran explicación, me ha servido para refrescar conocimientos. Muy buen post