-
Similitudes y diferencias entre C++ y Java
1. Puntero ★★★★★
Los punteros en C C++ proporcionan una gran flexibilidad, pero la flexibilidad también conlleva peligros. El funcionamiento inadecuado de los punteros puede causar fácilmente problemas como pérdidas de memoria o punteros colgantes.
Java cancela los punteros. Pero, de hecho, el nombre de todos los tipos de datos de referencia declarados en Java puede entenderse como un puntero. El nombre se almacena en la memoria de la pila y apunta al espacio abierto por novedades en la memoria.
como:
int[] matriz = nuevo int[10]
El nombre de la matriz de números enteros está en la memoria de la pila, se abre un espacio de 10 * 4 bytes en la memoria del montón y la matriz apunta al bloque de memoria.
La matriz puede entenderse como un puntero y la dirección almacenada en ella es el espacio creado por new.
como:
persona de clase {
…
}
Persona p = nueva Persona();
El nombre del objeto p se abre en la memoria de la pila y se usa nuevo para abrir espacio en la memoria del montón para el objeto. El nombre del objeto p apunta a la memoria del montón.
Pero, de hecho, el nombre no es como un puntero en C++, especialmente al pasar parámetros.
Java ha declarado que el paso de parámetros se realiza todo por valor.
Pero cuando el tipo de datos de referencia se usa como parámetro de función, cuando se pasa un objeto declarado p1, en realidad se genera una copia del objeto p2. Este p2 apunta a p1, por lo que cuando se llama a los miembros de p1 a p2, puede. se complete la modificación, espere hasta que se complete la llamada a la función y conserve la modificación. como:
persona de clase {
nombre de cadena pública;
edad interna pública;
Persona pública (nombre de cadena, edad int) {
this.nombre = nombre;
this.age = edad;
}
}
Prueba de clase pública {
principal vacío estático público (String [] argumentos) {
Persona p = nueva Persona ("Zhang San", 10);
System.out.println("Antes de la modificación-->Nombre: "+ p.name+", Edad: "+p.age);
changePro(p); // Se pasa el objeto p y se genera una copia de p. Supongamos que es p1, que apunta a p. // A través de esta copia p1, se pueden llamar miembros de p.
System.out.println("Después de la modificación-->Nombre: "+ p.name+", Edad: "+p.age);
}
public static void changePro(Person p){ // Los miembros del objeto original pueden ser llamados a través de la copia
p.name = "李思";
edad de página = 30;
}
}
resultado:
Antes de la modificación-->Nombre: Zhang San, edad: 10
Después de la modificación-->Nombre: Li Si, edad: 30
Pero cuando pasa p1, se genera una copia de p2, y luego intentar cambiar el apuntamiento de p1 a p2 es obviamente imposible. En este momento, solo se cambia el apuntamiento de p2. Una vez completada la llamada a la función, el apuntamiento. de p1 permanece sin cambios. como:
persona de clase {
nombre de cadena pública;
edad interna pública;
Persona pública (nombre de cadena, edad int) {
this.nombre = nombre;
this.age = edad;
}
}
Prueba de clase pública {
principal vacío estático público (String [] argumentos) {
Persona p = nueva Persona ("Zhang San", 10);
System.out.println("Antes de la modificación-->Nombre: "+ p.name+", Edad: "+p.age);
changeObj(p); // Se pasa el objeto p, que es una copia de p. //En la función, solo se cambia el puntero de esta copia.
System.out.println("Después de la modificación-->Nombre: "+ p.name+", Edad: "+p.age);
}
Persona pública estática newP = nueva Persona("李思", 30);
cambio de vacío estático públicoObj (Persona p) {
p = newP; //Intento cambiar el puntero, pero lo que realmente cambia es el puntero de la copia.
// Una vez finalizada la función, el puntero del objeto original no cambiará
}
}
resultado:
Antes de la modificación-->Nombre: Zhang San, edad: 10
Después de la modificación-->Nombre: Zhang San, edad: 10
2. Asignación de memoria dinámica
En C ++, nuevo y eliminar se usan para asignar y reciclar memoria dinámicamente. Nuevo es para abrir espacio en la memoria del montón. Una vez utilizada la memoria, la eliminación debe usarse manualmente para reciclarla.
Siempre que se declare un tipo de datos de referencia en Java, se debe usar new para abrir el espacio de memoria antes de usarlo. Pero una vez que el objeto muere, no es necesario recuperar la memoria manualmente. El propio mecanismo de reciclaje de memoria de Java reciclará automáticamente objetos basura (los llamados objetos basura se refieren a la memoria de objetos abierta previamente, a la que ya no hace referencia la memoria de la pila). Por supuesto, el reciclaje manual también se puede realizar mediante el método System.gc().
3. Destructor
La función del destructor de C ++ (sin parámetros, sin valor de retorno) es liberar el espacio de memoria asignado dinámicamente en el constructor, es decir, llamar (esta llamada se puede llamar a través del objeto. destructor, o el sistema puede esperar automáticamente hasta la vida útil del objeto finaliza. Llamada) destructor.
No hay destructor en Java y los objetos basura se reciclan automáticamente mediante el mecanismo de recolección de basura. Sin embargo, puede lograr el mismo efecto que el destructor en C++ anulando el método fanalize() en la clase Object. Cuando el objeto se destruye manual o automáticamente, se llamará automáticamente al método fanalize().
4. Contenidos en clases vacías
La clase vacía de C++ debe tener 4 funciones: constructor predeterminado, destructor predeterminado y constructor de copia predeterminado.
Las clases vacías de Java incluyen: constructor predeterminado, métodos heredados de la clase Objeto, como
Atributos predeterminados en las clases Hay tres tipos de permisos de acceso de miembros en las clases de C++: público>protegido>privado. Si no se declara, el permiso predeterminado es privado.
Hay cuatro tipos de permisos de acceso de miembros en las clases de Java: público>protegido>predeterminado>privado. El valor predeterminado es el permiso predeterminado.
5. Implementación de funciones miembro en clases.
Es habitual en C++. h La función se declara en la clase del archivo de encabezado fuera de la clase. Para implementar la función en el archivo cpp, #incluya el archivo de encabezado.
como:
//demostración.h
Persona de clase {
Público:
Diversión vacía(); //Declarado en clase
}
//demo.cpp
#incluir “demo.h”
Void Person::fun(){ //Implementación externa a la clase
. . . . //cuerpo de implementación
}
Java es un método de declaración + implementación en una clase. Si no está implementado en una clase, agregar la palabra clave abstracta es un método abstracto.
como:
persona de clase {
Public void fun(){//Declaración + implementación en clase
. . . . //cuerpo de implementación
}
}
6. Creación de instancias de objetos.
persona de clase {
privado:
edad interna;
público:
Persona(){}
Persona(int a){
edad = a ;
}
diversión vacía(){….}
}
. . . . //Inicio de la función principal
Persona p1; //Se llama al constructor sin parámetros.
Persona p2(18); //Llamar al constructor parametrizado
p1.fun(); // Llamar a la función miembro
p2.diversión();
Para crear una instancia de un objeto en Java, debe utilizar la nueva palabra clave.
persona de clase {
nombre de cadena privada;
edad privada;
Persona pública(){}
Persona pública (nombre de cadena, edad int) {
this.nombre = nombre;
this.age = edad;
}
diversión pública vacía() {…..}
}
. . . . . //Inicio de la función principal
Persona p1 = nulo;
p1 = new Person(); //Debes usar la nueva palabra clave para abrir espacio en la memoria y llamar al constructor sin parámetros.
Persona p2 = new Person("Zhang San", 18); // Llama al constructor parametrizado.
p1.fun(); //Método de llamada
p2.diversión();
7. Esta palabra clave
Se llama este puntero en C++. Cuando se crea una instancia de un objeto, se generará un puntero este de forma predeterminada para apuntar a este objeto. El compilador lo utiliza para distinguir diferentes objetos de la misma clase. Es decir, como objeto. Cuando usa una función miembro, sabe qué objeto es a través de este puntero y llama a la función miembro para operar las propiedades miembro del objeto.
Esto tiene tres usos en Java:
1. Representa los atributos o métodos de esta clase. Como este. Método, este. propiedad.
2. Representa el objeto actual.
3. Llame al método constructor de esta clase. Como this(), this(parámetro 1, parámetro 2...).
[Las funciones de los usos 1 y 2 son similares a este puntero en C++. 】
8. Llamar a miembros del objeto
C++ pasa objetos. Función miembro o puntero de clase->función miembro a llamar.
En Java, sólo puedes pasar objetos. Llamada a función miembro.
Los miembros del atributo Estático de los dos se pueden pasar directamente a través del nombre de la clase. Las funciones miembro se llaman directamente.
9. Subclase -> Clase principal, los parámetros pasados por el constructor tienen algo en común: si el constructor de la subclase no indica claramente a qué constructor de la clase principal llamar, el sistema llama de forma predeterminada al constructor sin parámetros del padre. clase. Al mismo tiempo, si la clase principal define un constructor con parámetros, es mejor definir un constructor sin parámetros.
persona de clase {
privado:
edad interna;
público:
Persona(){}
Persona(int a){
edad = a ;
}
}
estudiante de clase: persona pública {
privado:
puntuación interna;
público:
Estudiante(int a, int s):Persona(a){ //Pasar al constructor de la clase principal
puntuación = s;
}
}
persona de clase {
nombre de cadena privada;
edad privada;
Persona pública(){}
Persona pública (nombre de cadena, edad int) {
this.nombre = nombre;
this.age = edad;
}
}
clase Estudiante extiende Persona{
puntuación int privada;
Estudiante público (nombre de cadena, edad int, puntuación int) {
super(nombre,edad); //pasa al constructor de la clase padre
this.score = puntuación;
}
}
10. Polimorfismo
El polimorfismo en C++ debe lograrse mediante [función virtual o función virtual pura + cobertura de subclase de función virtual o función virtual pura].
Las funciones virtuales se declaran con virtual,
como:
diversión virtual vacía(); //Declaración dentro de la clase
nombre de clase vacía: fun() {….}//implementación de clase externa
Java usa subclases para anular métodos ordinarios en clases principales ordinarias, subclases para anular métodos ordinarios o métodos abstractos en clases abstractas y subclases para anular métodos abstractos en interfaces. +Transformar hacia arriba.
Los métodos abstractos se declaran con resumen y no tienen implementación de contenido.
como:
abstract void fun(); //Sin implementación dentro de la clase
11. Clases abstractas Ninguna clase abstracta puede crear instancias de objetos. Las funciones virtuales puras y los métodos abstractos tienen conceptos y funciones similares.
También se puede decir que existen clases abstractas en C++, clases con funciones virtuales puras.
Una función virtual pura es una función virtual sin implementación de contenido y "=0", y no puede crear instancias de objetos.
como:
virtual void fun() = 0; //Declarado como =0 dentro de la clase, no se implementa fuera de la clase.
Una clase abstracta en Java es una clase declarada con la palabra clave abstracta y contiene métodos abstractos. No se puede crear una instancia del objeto.
Una interfaz en Java es una clase especial o una clase abstracta especial. Está compuesto por todas las constantes estáticas y funciones abstractas.
12. Derechos de acceso
C++ utiliza tres métodos de herencia para cambiar los derechos de acceso de los miembros entre subclases y clases principales.
estudiante de clase: persona pública {
público:
. . . . . .
Privado:
. . . . . .
};
trabajador de clase: persona protegida {
público:
. . . . . .
Privado:
. . . . . .
};
Granjero de clase: persona privada {
público:
. . . . . .
Privado:
. . . . . .
};
Java implementa permisos de acceso a miembros entre diferentes clases a través del mecanismo de paquete.
Paquete org.tyut.a
persona de clase {
privado…..
privado……
público…….
público…
}
paquete org.tuyt.b
persona de clase {
privado…..
privado……
público…….
público…
}
paquete org.tuyt.c
persona de clase {
privado…..
privado……
público…….
público…
}
13. La idea del preprocesamiento de C++ y el paquete de importación de Java es la misma: cuando desee utilizar una clase distinta de la clase actual,
En C++, utilice la directiva de precompilación #include antes de la definición de clase para incluir la biblioteca de clases que se incluirá.
Las bibliotecas de clases estándar utilizan corchetes angulares < > sin h. Utilice comillas dobles "" con h en la biblioteca de clases personalizadas y se buscará primero desde la ruta actual.
como:
#incluir <iostream>
#incluir “demo.h”
En Java, para importar la clase que desea utilizar, utilice el comando de importación e indique el paquete en el que se encuentra la clase.
como:
importar java. Lang. *;
importar organización. tyut. *;