Funciones y clases
Friend.
Por lo general,
un miembro privado de una clase no puede ser accedido desde fuera de esa clase, sin embargo si
una función que se encuentre fuera de la clase se declara como su amiga, entonces
tiene permiso para acceder a los miembros de la clase.
El uso de
funciones amigas se usa comúnmente cuando no se puede usar una función miembro
para ciertas operaciones.
Para declarar
una función amiga de una clase, se debe anteponer la palabra clave friend al
prototipo de la función en la definición de la clase. Esta declaración puede
hacerse en cualquier parte de la clase, pero por convención, se hace al
principio. Para hacer su miembro accesible, la clase tiene que declarar la
función como una amiga en su definición, no se puede ser amiga de una clase,
sin que la clase entregue su amistad a la función.
Ejemplo:
#include<iostream>
using
std::cout;
using
std::endl;
class
Amiga{
friend void modificar(Amiga
&);
public:
Amiga():
x(0){}
void
imprimir() const{
cout << x << endl;
}
private:
int x;
};
En esta primera parte podemos ver que la declaración
de friend, aparece primero dentro de la clase.
friend
void modificar(Amiga &);
Incluso antes de las declaraciones miembro public,
como se dijo antes, las declaraciones friend, pueden aparecer en cualquier
parte de la clase, pero por convención, se colocan al principio.
La función friend, debe llevar como argumento un
objeto del tipo de la clase a la que va a acceder, por eso es que el argumento
en este caso es "Amiga", el cual lleva el nombre de la clase. Además,
el acceso es por referencia, por eso es que se utiliza el operador &.
Lo siguiente que destaqué en esta clase, fue la
declaración de la variable int x. Esto es debido a
que esta es la variable que será modificada por la función. En un principio,
esta variable es iniciada por el constructor con un valor de cero.
Posteriormente, nos encontramos con una función
individual, al estilo del lenguaje C, la cual habíamos declarado previamente.
Esta función no es miembro de la clase Amiga. El trabajo de esta función es
modificar el valor de la variable x, por un valor de 10.
void
modificar(Amiga &c){
c.x = 10;
}
Luego, pasamos a la función main. En esta función
vamos a crear un objeto cambio, de la clase amiga.
int main(){
Amiga
cambio;
Una vez creado el objeto, llamamos a la función
imprimir, la cual nos mostrará el valor inicial de la variable x, en este caso
cero.
cambio.imprimir();
Posteriormente, se modificará el valor de esa
variable, llamando a la función modificar (recordar que es una función amiga),
pasando como argumento, el objeto creado.
modificar(cambio);
Por último, se llama nuevamente a la función
imprimir, para verificar el valor de la variable x. En este caso, al haber
modificado la variable, su valor pasó a ser 10.
cambio.imprimir();
Al compilar
y ejecutar este código, muestra el siguiente resultado:
El código
completo es el siguiente:
#include<iostream>
using std::cout;
using std::endl;
class Amiga{
friend void
modificar(Amiga &);
public:
Amiga():
x(0){}
void imprimir() const{
cout << x << endl;
}
private:
int x;
};
void modificar(Amiga &c){
c.x = 10;
}
int main(){
Amiga cambio;
cambio.imprimir();
modificar(cambio);
cambio.imprimir();
return 0;
}
Esto es todo por ahora, espero se entienda. Saludos.
Gustavo J. Cerda Nilo, Julio 2018