Para asignar memoria de forma dinámica C++ dispone de los operadores new y delete, sin embargo en el caso de arrays estáticos sigue declarándose como siempre. Además recuerda que C++ es un superconjunto de C, por lo tanto puede utilizar el método convencional que utilizabas en C (con malloc) que también es aceptado.
Si querés hacer un array de la clase X debés proceder del siguiente modo:
class X
{ int a;
void loquesea();
};
void main()
{
X miX[40]; // array de 40 objetos X
X * pX = new X[40]; // asignación dinámica
// ...
pX[0].a = 20; // accediendo a la propiedad a del objeto 0 de pX
//...
Por otro lado, si utilizas malloc para pedir memoria para guardar objectos de clases, no se llama a los constructores de esas clases.
Ademas, si quieres conseguir un array de objetos, la clase debe tener un constructor por defecto (sin parámetros), pues no se puede llamar a un constructor específico.