Función miembro estática en C++ (ejemplos)

¿Qué es una función estática en C++?

En las clases de C++, un miembro estático es un miembro de clase que pertenece a la clase y no a sus objetos. Sólo tendrás una copia de la membresía. Este es el caso independientemente del número de objetos que cree.

Cuando una función de clase se define como estática, todos los objetos de clase comparten un miembro de clase estático. Por lo tanto, se puede acceder a la función estática sin crear ningún objeto de clase y se vuelve independiente de objetos de clase. Un miembro de datos estáticos en C++ puede acceder a otras funciones estáticas, únicamente fuera de la clase.

¿Por qué utilizar funciones estáticas?

A diferencia de las funciones globales de C++, solo se puede acceder a las funciones estáticas desde el archivo de declaración. Si es necesario restringir el acceso a una función, hágala estática.

Utilice una función estática para restringir la reutilización del mismo nombre de función en otro archivo.

Definición de funciones estáticas en C++

Sintaxis:

static int myfunc(void)
{
    cout("Example of C++ static function ");
}

En el ejemplo anterior, estamos definiendo una función estática llamada myfunc. Observe el uso de la palabra clave estática en la definición. La palabra clave va antes del nombre de la función.

Función miembro estática en C++

Cuando un miembro de una función se declara estático, se vuelve independiente de otros objetos de la clase. Puede llamar a una función miembro estática incluso si no existen otros objetos de clase.

Para acceder a los nombres de las clases, debe utilizar el nombre de la clase y el operador de resolución de alcance. (::). Una función estática solo puede acceder a otras funciones estáticas, miembros de datos estáticos y otras funciones fuera de la clase. El alcance de las funciones miembro estáticas se encuentra dentro de la clase y no pueden acceder a este puntero de clase.

ejemplo 1

#include<iostream>
using namespace std;
class BoxClass {
public:
	static int count;
	BoxClass(double l = 2.0, double b = 2.0, double h = 2.0) {
		cout << "Class constructor called." << endl;
		length = l;
		breadth = b;
		height = h;
		count++;
	}
	double getVolume() {
		return length * breadth * height;
	}
	static int getCount() {
		return count;
	}
private:
	double length;     
	double breadth;    
	double height;     
};
int BoxClass::count = 0;
int main(void) {
	cout << "Inital value of count is : " << BoxClass::getCount() << endl;
	BoxClass Box1(3.2, 1.4, 1.8);    
	BoxClass Box2(7.5, 4.0, 4.0);   
	cout << "Final value of count is : " << BoxClass::getCount() << endl;
	return 0;
}

Salida:

Función de miembro estático

Aquí hay una captura de pantalla del código:

Función de miembro estático

Explicación del código:

  1. Incluir el archivo de encabezado iostream en nuestro programa C++ para usar su funciones.
  2. Incluya el espacio de nombres estándar en el código para usar sus clases sin llamarlo.
  3. Crea una clase llamada BoxClase.
  4. Utilice el modificador de acceso público para marcar un miembro de la clase que sea accesible públicamente.
  5. Se declara un miembro de clase estática llamado recuento.
  6. Utilice un constructor de clases para inicializar tres variables de un double tipo.
  7. Imprime algo de texto en la consola. La función endl (final de línea) mueve el cursor del mouse a la siguiente línea.
  8. Inicialice el valor de l a una longitud variable.
  9. Inicialice el valor de b a amplitud variable.
  10. Inicialice el valor de h a una altura variable.
  11. Luego aumente el valor de la variable count en 1 cada vez que se crea un nuevo objeto.
  12. Fin del cuerpo del constructor.
  13. Crea una función llamada doublevolumen().
  14. Definir lo que doubleLa función Volumen() volverá. Debería devolver la multiplicación de las variables largo, ancho y alto.
  15. Fin del doubleCuerpo de la función Volumen().
  16. Declare una función estática llamada getCount().
  17. La función getCount() debería devolver el valor de la variable de conteo.
  18. Fin del cuerpo de la función getCount().
  19. Utilice el modificador de acceso privado para marcar a un miembro de la clase como de acceso público.
  20. Declarar un miembro de la clase llamado longitud de un double tipo de datos. Será de acceso privado.
  21. Declarar otro miembro de la clase llamado amplitud de un double tipo de datos. Será de acceso privado.
  22. Declarar un miembro de la clase llamado altura de double tipo de datos. Será de acceso privado.
  23. Fin del cuerpo del BoxClase de clase.
  24. Luego inicialice un miembro estático del BoxClase de clase.
  25. Llamando a la función main(). La lógica del programa C++ debe agregarse dentro del cuerpo de esa función.
  26. Imprima un texto en la consola que indique el número actual de objetos antes de que se creen nuevos objetos.
  27. Declarar un objeto llamado Box1, que es una de las instancias de la clase. BoxClase. Los valores de ancho, largo y alto deben especificarse entre paréntesis.
  28. Declarar un objeto llamado Box2, que es una instancia de la clase BoxClase. Los valores de ancho, largo y alto se han especificado entre paréntesis.
  29. Imprima un texto en la consola indicando el número actual de objetos después de la creación de nuevos objetos.
  30. El Programa C ++ debe devolver valor al finalizar con éxito.
  31. Fin del cuerpo de la función main().

Acceso a funciones estáticas

No es necesario crear un objeto de clase para acceder a una función estática. En su lugar, puede utilizar el operador de resolución de alcance y nombre de clase (::).

Sintaxis:

className::funcName

Arriba, className es el nombre de la clase donde se ha definido la función estática. funcName es el nombre asignado a la función estática.

ejemplo 2

#include<iostream> 
using namespace std;
class MyClass {
public:
	static void msgFunc() {
		cout << "Welcome to Guru99!";
	}
};
int main() {
	MyClass::msgFunc();
}

Salida:

Acceso a funciones estáticas

Aquí hay una captura de pantalla del código:

Acceso a funciones estáticas

Explicación del código:

  1. Incluyendo el archivo de cabecera iostream en nuestro programa para utilizar sus funciones.
  2. Incluye el espacio de nombres estándar en tu código para usar sus clases sin llamarlo.
  3. Crea una clase llamada MyClass.
  4. Utilice el modificador de acceso público para marcar a un miembro de la clase como de acceso público.
  5. Declarando una función estática llamada msgFunc(). La palabra clave estática hace que la función sea estática.
  6. Especifique el texto que se imprimirá en la consola una vez que se llame/invoque la función anterior.
  7. Fin del cuerpo de la función msgFunc().
  8. Termina el cuerpo de la clase.
  9. Llamando a la función main().
  10. Llame a la función estática denominada msgFunc().
  11. Fin del cuerpo de la función main().

Accediendo a variables estáticas

Las variables estáticas pertenecen a una clase y no a objetos de clase. Si una variable estática es pública, se puede acceder a ella usando el nombre de la clase y usando el operador de resolución de alcance. Sin embargo, esto no es posible si un miembro estático es privado.

Normalmente, se accede a las variables privadas mediante funciones públicas. Sin embargo, se debe crear una instancia/objeto de clase. La solución es utilizar una función estática.

Ejemplo 3: variable estática en la clase C++

#include<iostream> 
using namespace std;
class AClass {
private:
	static int myvar;
public:
	static int getVar() { 
		return myvar; 
		} 
};
int AClass::myvar = 23; 
int main() {
	cout <<"The value of myvar is: "<< AClass::getVar() << '\n';
}

Salida:

Accediendo a variables estáticas

Aquí hay una captura de pantalla del código:

Accediendo a variables estáticas

Explicación del código:

  1. Incluyendo el archivo de encabezado iostream en nuestro programa.
  2. Incluya el espacio de nombres estándar en este programa para usar sus clases sin llamar.
  3. Crea una clase llamada AClass.
  4. Utilice el modificador de acceso privado para hacer que la variable myvar sea accesible de forma privada.
  5. Cree una variable entera estática llamada myvar.
  6. Utilice el modificador de acceso público que marca la función getVar() como de acceso público.
  7. Creando una función estática llamada getVar().
  8. La función getVar() debería poder devolver el valor de la variable myvar.
  9. Fin del cuerpo de la función getVar().
  10. Final del cuerpo de la clase AClass.
  11. Asigne a la variable myvar un valor de 23. Hemos utilizado el operador de resolución de alcance y nombre de clase para esto.
  12. Llamando a la función main().
  13. Imprima el valor de la variable myVar en la consola junto con otro texto. Hemos utilizado el nombre de la clase, la función estática y el operador de resolución de alcance para acceder al valor de esta variable.
  14. El final del cuerpo de la función main().

este puntero en funciones estáticas

Una función estática no está adjunta a un objeto. Por eso las funciones estáticas no tienen este puntero. El puntero de un objeto normalmente apunta al objeto en el que está trabajando actualmente. Dado que las funciones estáticas no funcionan con objetos, no es necesario este puntero.

Las funciones estáticas tienen acceso directo a otros miembros estáticos. Sin embargo, este no es el caso de los miembros no estáticos. La razón es que los miembros no estáticos tienen que pertenecer a un objeto, pero las funciones estáticas no tienen objetos con los que trabajar.

ejemplo 4

Es posible definir una función estática fuera de la declaración de clase. Demostremos esto:

#include<iostream> 
using namespace std;
class NumGenerator {
private:
	static int nextNum; 
public:
	static int getNextNum();
};
int NumGenerator::nextNum = 1;
int NumGenerator::getNextNum() {
	return nextNum++; 
}
int main() {
	for (int count = 0; count < 5; ++count)
		std::cout << "The next number is: " << NumGenerator::getNextNum() << '\n';
	return 0;
}

Salida:

este puntero en funciones estáticas

Aquí hay una captura de pantalla de su código:

este puntero en funciones estáticas

Explicación del código:

  1. Incluyendo el archivo de encabezado iostream en nuestro código para usar sus funciones.
  2. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  3. Crea una clase llamada NumGenerator.
  4. Usando el modificador de acceso privado para marcar la variable, estamos a punto de crearla como accesible de forma privada.
  5. Cree una variable entera estática llamada nextNum.
  6. Usando el modificador de acceso público que le ayuda a marcar la variable que estamos a punto de crear como de acceso público.
  7. Declarar una función estática llamada getNextNum().
  8. Fin del cuerpo de la clase.
  9. Asigne a la variable nextNum un valor de 1. Hemos hecho esto usando el nombre de clase, el nombre de la variable y el operador de resolución de alcance.
  10. Definir la función estática getNextNum() fuera de la clase.
  11. Especifique la acción que se tomará cuando se llame/invoque la función anterior. Incrementará el valor de la variable nextNum en 1.
  12. Fin de la definición de la función getNextNum().
  13. Llamando a la función main(). La lógica del programa C++ debe agregarse dentro del cuerpo de esta función.
  14. Utilizar en bucle para crear una variable llamada recuento. El valor de esta variable debe incrementarse de 0 a 4. Después de cada iteración, el valor de la variable aumentará en 1.
  15. Imprimir el valor de la variable nextNum junto con otro texto en la consola en cada iteración. Se accede al valor mediante la función getNextNum().
  16. Este programa C++ debe devolver valor una vez completado con éxito.
  17. Fin de la función main().

Resumen

  • Los miembros estáticos de C++ son miembros de clase que pertenecen a la clase en lugar de a sus objetos.
  • Solo tendrá una copia de un miembro estático independientemente de la cantidad de objetos que cree.
  • Todos los objetos de clase comparten cada miembro de clase estática.
  • Después de definir una función de clase como estática, se vuelve independiente de los objetos de clase.
  • Se puede acceder a una función estática incluso si no crea ningún objeto de clase.
  • Sin embargo, las funciones estáticas no tienen este objeto, que apunta a objetos de clase.