Función de miembro estático en C++ (Ejemplos)
¿Qué es una función estática en C++?
In C++ clases, un miembro estático es un miembro de clase que pertenece a la clase en lugar de 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, solo fuera de la clase.
¿Por qué utilizar funciones estáticas?
Diferente a la C++ Funciones globales, las funciones estáticas solo son accesibles 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 de miembro estático 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 clase, 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
#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:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluir el archivo de encabezado iostream en nuestro C++ programa para utilizar su funciones.
- Incluya el espacio de nombres estándar en el código para usar sus clases sin llamarlo.
- Crea una clase llamada BoxClase.
- Utilice el modificador de acceso público para marcar un miembro de la clase que sea accesible públicamente.
- Se declara un miembro de clase estática llamado recuento.
- Utilice un constructor de clase para inicializar tres variables de tipo doble.
- 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.
- Inicialice el valor de l a una longitud variable.
- Inicialice el valor de b a amplitud variable.
- Inicialice el valor de h a una altura variable.
- Luego aumente el valor de la variable count en 1 cada vez que se crea un nuevo objeto.
- Fin del cuerpo del constructor.
- Crea una función llamada doublevolume().
- Define lo que devolverá la función doubleVolume(). Debe devolver la multiplicación de las variables length, widthth y height.
- Fin del cuerpo de la función doubleVolume().
- Declare una función estática llamada getCount().
- La función getCount() debería devolver el valor de la variable de conteo.
- Fin del cuerpo de la función getCount().
- Utilice el modificador de acceso privado para marcar a un miembro de la clase como de acceso público.
- Declaración de un miembro de clase llamado length de un tipo de datos double. Será accesible de forma privada.
- Declare otro miembro de clase llamado broadth de un tipo de datos double. Será accesible de forma privada.
- Se declara un miembro de clase llamado altura de tipo de datos doble. Será accesible de forma privada.
- Fin del cuerpo del BoxClase de clase.
- Luego inicialice un miembro estático del BoxClase de clase.
- Llamando a la función main(). El C++ La lógica del programa debe agregarse dentro del cuerpo de esa función.
- Imprima un texto en la consola que indique el número actual de objetos antes de que se creen nuevos objetos.
- 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.
- 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.
- Imprima un texto en la consola indicando el número actual de objetos después de la creación de nuevos objetos.
- La C++ programa debe devolver valor al finalizar con éxito.
- 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 nombre de clase y el operador de resolución de ámbito. (::)
.
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
#include<iostream> using namespace std; class MyClass { public: static void msgFunc() { cout << "Welcome to Guru99!"; } }; int main() { MyClass::msgFunc(); }
Salida:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluyendo el archivo de cabecera iostream en nuestro programa para utilizar sus funciones.
- Incluye el espacio de nombres estándar en tu código para usar sus clases sin llamarlo.
- Crea una clase llamada MyClass.
- Utilice el modificador de acceso público para marcar a un miembro de la clase como de acceso público.
- Declarando una función estática llamada msgFunc(). La palabra clave estática hace que la función sea estática.
- Especifique el texto que se imprimirá en la consola una vez que se llame/invoque la función anterior.
- Fin del cuerpo de la función msgFunc().
- Termina el cuerpo de la clase.
- Llamando a la función main().
- Llame a la función estática denominada msgFunc().
- 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 mediante el nombre de la clase y el operador de resolución de ámbito. 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 C++ clase
#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:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluyendo el archivo de encabezado iostream en nuestro programa.
- Incluya el espacio de nombres estándar en este programa para usar sus clases sin llamar.
- Crea una clase llamada AClass.
- Utilice el modificador de acceso privado para hacer que la variable myvar sea accesible de forma privada.
- Cree una variable entera estática llamada myvar.
- Utilice el modificador de acceso público que marca la función getVar() como de acceso público.
- Creando una función estática llamada getVar().
- La función getVar() debería poder devolver el valor de la variable myvar.
- Fin del cuerpo de la función getVar().
- Final del cuerpo de la clase AClass.
- Asigne a la variable myvar un valor de 23. Para ello, hemos utilizado el nombre de clase y el operador de resolución de alcance.
- Llamando a la función main().
- 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.
- 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
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:
Aquí hay una captura de pantalla de su código:
Explicación del código:
- Incluyendo el archivo de encabezado iostream en nuestro código para usar sus funciones.
- Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
- Crea una clase llamada NumGenerator.
- Usando el modificador de acceso privado para marcar la variable, estamos a punto de crearla como accesible de forma privada.
- Cree una variable entera estática llamada nextNum.
- 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.
- Declarar una función estática llamada getNextNum().
- Fin del cuerpo de la clase.
- Asigna a la variable nextNum un valor de 1. Hemos hecho esto usando el nombre de la clase, el nombre de la variable y el operador de resolución de alcance.
- Definir la función estática getNextNum() fuera de la clase.
- Especifique la acción que se tomará cuando se llame/invoque la función anterior. Incrementará el valor de la variable nextNum en 1.
- Fin de la definición de la función getNextNum().
- Llamando a la función main(). El C++ La lógica del programa debe agregarse dentro del cuerpo de esta función.
- 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.
- 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().
- Este C++ El programa debe devolver valor al finalizar con éxito.
- Fin de la función main().
Resum
- C++ Los miembros estáticos 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.