¿Cuáles son los nombres del constructor y el destructor en una clase java? ¿Java necesita liberar recursos manualmente?
No pongas simplemente las definiciones de constructores y destructores en la declaración de clase. Inline no está en línea, no afectará la semántica predeterminada del constructor y la construcción de la clase base no se ejecutará solo porque no está en línea. Es posible que el constructor externo todavía esté en línea. Si el constructor es demasiado complejo, escríbalo en la definición de clase y no en línea.
Creo que la razón es esta: C++ aboga por la separación de implementación e interfaz en la declaración. Solo se proporcionan los parámetros requeridos, o incluso se proporciona el tipo de parámetro, sin parámetros. Si lo escribe en una declaración, no querrá dar el cuerpo de la función para que todos puedan ver el código. Quizás puedas reescribir el tuyo. h directamente y luego recompilar para lograr el control directo de los miembros privados, lo que no favorece el empaquetado. El diseño de C++ permite implementar un compilador concreto universal. Introduzca el formulario de declaración. implementación en. cpp, compilado y generado. obj y elimínelo. cpp (o no distribuirlo a los usuarios). Los usuarios sólo necesitan esto. objeto y. Pueden usarlo en sus propios programas. Si el constructor proporciona código directamente dentro de la definición de clase, equivale a permitir que el usuario lo cambie a voluntad. Puede tener más efectos secundarios negativos que otras características genéricas.
¿Se pueden incorporar constructores, destructores y funciones virtuales? ¿no tiene sentido? No hay errores gramaticales. En primer lugar, debe comprender que los constructores, destructores y funciones virtuales pueden declararse como funciones en línea, lo cual es gramaticalmente correcto.
Cuando se hace referencia a un objeto a través de un puntero o referencia, las llamadas a funciones virtuales no se pueden insertar porque las llamadas deben resolverse dinámicamente. Motivo: el apilador no sabe qué código real se llamó hasta el tiempo de ejecución (es decir, dinámicamente), porque el código puede provenir de una clase derivada que se creó después de que se apiló el programa que realiza la llamada. Por lo tanto, una llamada a una función virtual en línea solo se puede incluir en línea si el compilador conoce la "clase exacta" del objeto que es el objetivo de la llamada a la función virtual. Esto sólo puede suceder si el compilador tiene un objeto real, en lugar de un puntero o referencia a un objeto. Es decir, un objeto local, un objeto global/estático o un objeto completamente contenido en el sitio.
Me gustaría preguntar: ¿El destructor sintético generado automáticamente por el compilador hace el trabajo de liberar recursos? Gracias. No, si necesita liberar recursos, debe escribir el destructor usted mismo.
Abre la conexión a la base de datos en el constructor. ¿Cómo puede JAVA cerrar automáticamente el constructor de una subclase sin un destructor? De forma predeterminada, se llamará al constructor sin parámetros de la clase principal, como en el constructor public Student (nombre de cadena, intage, escuela de cadena) { super(); esta es la declaración predeterminada, por lo que no es necesario llamarla. name = namethis.age = Age; this.school = school;}
¿Quién carga primero la función principal y el constructor en Java? Por supuesto, la función principal es lo primero.
La entrada del programa es la función principal.
En cuanto al constructor. . Sólo si quieres utilizar esta clase. Es decir, no se cargará hasta que salga algo nuevo de esta clase.
Yo iré. ¿Por qué la gente detrás dice constructor? . . La funcionalidad principal es estática. . ¡Se instaló cuando se instaló por primera vez!
Necesita un programa c# anotado, en el que lo mejor es indicar el constructor, destructor, propiedades, etc. ~ ~ namespace gXlogic.
{
Clase pública GetLogicDisposedList
{
Variable miembro #Región
Se viola la cadena pública PeancyTimeL desde Desde el momento
Cadena pública PeancyTimeH El tiempo ilegal ha expirado.
Tiempo de procesamiento de cadena pública DisposeTimeL
Tiempo de procesamiento de cadena pública DisposeTimeH
Tipo de placa de cadena pública PlateType
Número de placa de cadena pública; Número de matrícula
Cadena pública PeancyAdressLugar ilegal
Dirección de la cadena pública; Dirección para caminar
Cadena pública PeancyTypeActividad ilegal
Cadena pública Controlador DisposedPerson ( cuando los datos son de tipo procesamiento - handler)
#End area
Public GetLogicDisposedList()
{
PeancyTimeL = p>
PeancyTimeH =
DisposeTimeL =
DisposeTimeH =
PlateType =
PlateNumber =
PeancyAdress =
Derección =
PeancyType =
DisposedPerson =
}
Este es el constructor, el El destructor rara vez se usa en C#. Si quieres saber más sobre esto, puedes echar un vistazo a C++
Escribir el constructor y el destructor de la clase String. El prototipo de la clase String se conoce como: Class String { public:String(destructor de constcharstring.
String::~String(void)
{
Eliminar[]m_data;
Debido a que m_data es un tipo de datos interno, también se puede escribir como eliminar m_data
}
Construcción común de función de cadena p>
Cadena::Cadena(const char *cadena)
{
if(cadena==NULL)
{ p>
m _ data = new char[1]; también podría agregar una declaración nula
* m _ data = ' \ 0
}
. Otros
{
int length = strlen(str);
m _ data = new char[length+1]; juicio
strcpy(m_data, str);
}
}
Copiar constructor
Cadena: : String(cadena constante y amp other)
{
int length = strlen(other . m _ data
m _ data = new char[); length +1]; También podría agregar una declaración nula
strcpy(m_data, other . m _ data
}
Función de asignación
Cadena y cadena. String::operate = (const String & amp; other)
{
Comprueba la autoasignación
if (this) = = & amp others)
Devolver * esto
Liberar los recursos de memoria originales
Eliminar []m_data;
Asignar nuevos
int length = strlen(other . m _ data
m _ data = new char[length + 1]; agregue una declaración nula
strcpy(m_data, other . m_data);
Devuelve una referencia al elemento
Devuelve *this
<. p>}.[Reimprimir] ¿Por qué no se puede declarar el constructor como una función virtual? Los destructores pueden declararse como funciones virtuales, los destructores pueden declararse como funciones virtuales y, a veces, deben declararse como funciones virtuales.
No se recomienda llamar a funciones virtuales en constructores y destructores.
La razón por la que el constructor no puede declararse como una función virtual es que al construir un objeto, uno debe conocer el tipo real del objeto. El comportamiento de la función virtual es determinar el tipo real en la ejecución. tiempo. Al construir el objeto, porque el objeto no se ha construido con éxito. El compilador no reconoce el objeto. El tipo real de
es la clase misma, una clase derivada de la clase o una clase derivada más profunda. No puedo estar seguro. . .
La ejecución de funciones virtuales depende de la tabla de funciones virtuales. Sin embargo,
la tabla de funciones virtuales se inicializa en el constructor
, es decir, el vptr inicializado apunta a la tabla de funciones virtuales correcta. Durante la construcción del objeto, la tabla de funciones virtuales aún no se ha inicializado.
No se puede inicializar.
Cuando el compilador llama al constructor de una clase base, no sabe si desea construir un objeto de la clase base o un objeto de la clase derivada.
El papel del destructor como función virtual: Explicación: en la herencia de clases, si el puntero de la clase base apunta a la clase derivada, entonces si la eliminación del puntero de la clase base no está definida como una función virtual, entonces la parte de clase derivada no puede ser destruida. Ejemplo: #include "stdafx.h "
# include " stdio . h " clase A { public:A(); virtual ~ A();};A::A(){}A: :~A(){
printf("Eliminar clase APn ");}
Clase B: pública A { pública:B();~ B();};B ::B(){ }B::~B(){
printf("Eliminar clase BPn ");}
int main(int argc, char* argv[] ){
A * b = new B; eliminar b; devolver 0;}
El resultado de salida es: eliminar la clase b.
Eliminar clase A
Si se elimina el objeto de A, se convierte en Eliminar clase A, lo que significa que el resto del contenido de la clase derivada no se eliminará, lo que significa que la clase derivada no se eliminará. No se llamará a la función virtual.
Por lo tanto, en el sistema de herencia de clases, si el destructor de la clase base no se declara como una función virtual, es fácil provocar una pérdida de memoria. Entonces, si diseñas una clase que puede ser una clase base, debes declararla como una función virtual. Como CBase en Symbian.
Nota: 1.
Si definimos un constructor, el compilador no generará un constructor predeterminado para nosotros.
2. El destructor generado por el compilador no es virtual, a menos que sea una subclase cuya clase principal tenga un destructor virtual. En este caso, las características virtuales de la función provienen de la clase principal.
3. Es casi seguro que una clase con una función virtual tendrá un destructor virtual.
4. Si una clase no puede ser una clase base, no declare el destructor como una función virtual. Las funciones virtuales consumen espacio. 5.
La salida anormal del destructor provocará una destrucción incompleta, lo que provocará pérdidas de memoria. Es mejor proporcionar una clase de administración y un método en la clase de administración para realizar la destrucción. La persona que llama decidirá la siguiente operación en función del resultado de este método. 6.
No llame a funciones virtuales en el constructor. Al construir una clase base, la función virtual es una función no virtual y no ingresará a la clase derivada. Está vinculada estáticamente. Obviamente, cuando construimos un objeto de una subclase, lo primero que debemos llamar es el constructor de la clase base, y la subclase aún no se ha construido ni inicializado. Si llamamos a una función virtual al construir una clase base, es muy peligroso llamar a un objeto que no ha sido inicializado. Por lo tanto, es imposible llamar a la función virtual de una subclase al construir un objeto de la clase principal en C++. Pero eso no significa que no puedas escribir un programa así.
Si lo escribes así, el compilador no informará ningún error. Simplemente si lo escribe así, el compilador no llamará a la implementación de la subclase por usted, sino a la implementación de la clase base. 7. No llame a funciones virtuales en el destructor. Durante la destrucción, primero se llamará al destructor de subclase para destruir la parte de subclase del objeto, y luego se destruirá la parte de clase base llamando al destructor de clase base. Si llama a una función virtual en el destructor de una clase base, hará que llame a la función en el objeto de la subclase destruida, lo cual es muy peligroso. 8.
Al escribir la función de copia de la clase derivada, recuerde llamar a la función de copia de la clase base para copiar la parte de la clase base.
Escribir una clase compleja con constructores, destructores, = operación funciones sobrecargadas e imprimir funciones, prueba #include
Usar espacio de nombres std
Clase compleja {
Doble real;
Doble imag
Público:
Plural (doble pr=1, doble pi =1){
real = primag = pi
cout & lt& lt"Objeto de construcción...\ n ";
}
~ Complex(){ cout < ;<"Destruir objetos...\n";}
Complejo & operador = (const Complejo & c){
Si (this == & ampc)
Devolver * esto
real = c.real
imag = c.imag
Devolver * esto
} p>
visualización vacía(){
cout & lt& ltreal & lt& lt(imag & gt=0 ?"+": " " " & lt;& ltimag & lt& lt"I"& lt& ltendl
}
};
int main(){
Número complejo c1(3.3,-4.4), C2;
C2 = c 1;
c 1 . mostrar();
C2 mostrar ();
Devuelve 0;<. /p>
}