martes, 24 de julio de 2018

C++ Funciones Friend


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

No hay comentarios:

Publicar un comentario

C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...