RE:Sobrecarga de operadores
1.- Es correcto como o tienes escrito ya que una copia del valor devuelto es asignada en operaciones de asignación, como:
matriz a(valores de inicio);
matriz b(valores de inicio);
matriz c = a+b;
2.- Es correcta pero no recomendable poner directamente literales en indices de arreglos (entre otros), mas bien se usa el poner constantes simbólicas como :
const int FILAS = 5;
const int COLS = 5;
en algún otro lugar y declarar el arreglo
float matriz[COLS][FILAS];
Además hay que inicializar el arreglo, un buen lugar es el constructor de la clase:
matrices()
{
...
maitriz = new float[COLS][FILAS];
...
}
3.- Es correcto, la diferencia está en que se ocupa más memoria, ya que los parámetros por valor se copian para usar en la función, y en los parámetros por referencia no es así, se usa el objeto originalmente referenciado.
4.- Esencialmente no hay diferencia ya que las funciones friend pueden tener acceso a los miembros privados de la clase. La diferencia se da cuando sobrecargas un operador con un operando que no es un objeto de la clase, como en la siguiente hipotetica función para multiplicar una constante por los elementos de una matriz:
float PI= 3.1416;
matrices m(valores de inicio);
matrices n = PI*m;
no hay forma de implementar esto como una función miembro, porque para invocar la función miembro se necesita un objeto del lado izquierdo del operador, por lo que esta función se impementa como friend.
Esquemáticamente el cuerpo sería:
public matrices operator+(matrices& m)
{
matrices res; // matriz que guarda el resultado de la suma
// algoritmo para sumar las matrices, los miembros de el objeto anfitrión (host) se
// invocan directamente, los de la matriz pasada en el argumento se invocan en la
// forma m.miembro
return res;
}