Si estás definiendo un número racional toma en cuenta que el denominador debe ser diferente de cero, podrías utilizar un solo constructor:
Código C++:
Ver originalfracciones(int a = 1, int b = 0):de(a), no(b){
}
Con esto tendrías por default al número 0/1 (cero) y no el 0/0 que sería un error matemáticamente hablando.
Me parece que si la variable "de" es el denominador y "no" el númerador deberias invertir el orden de las variables en el código para que sea más claro.
Por otro lado para definir el producto es suficiente con que retornes por valor el resultado de la operación, ya que por referencia al final no obtendrás el comportamiento habitual al hacer las operaciones:
Código C++:
Ver originalconst fracciones operator*(const fracciones& c){
return fracciones(de * c.de, no * c.no);
}