-
Semelhanças e diferenças entre C++ e Java
1. Ponteiro ★★★★★
Ponteiros em C C++ oferecem grande flexibilidade, mas a flexibilidade também traz perigos. A operação inadequada de ponteiros pode facilmente causar problemas como vazamentos de memória ou ponteiros pendentes.
Java cancela ponteiros. Mas, na verdade, o nome de todos os tipos de dados de referência declarados em Java pode ser entendido como um ponteiro. O nome é armazenado na memória da pilha e aponta para o espaço aberto por new na memória.
como:
int[] matriz = novo int[10]
A matriz de nome da matriz inteira está na memória da pilha e um espaço de 10 * 4 bytes é aberto na memória heap e a matriz aponta para o bloco de memória.
Array pode ser entendido como um ponteiro, e o endereço armazenado nele é o espaço criado por new.
como:
classe Pessoa{
…
}
Pessoa p = new Pessoa();
O nome do objeto p é aberto na memória da pilha e new é usado para abrir espaço na memória heap para o objeto. O nome do objeto p aponta para a memória heap.
Mas, na verdade, o nome não é como um ponteiro em C++, principalmente ao passar parâmetros.
Java afirmou que a passagem de parâmetros é toda por valor.
Mas quando o tipo de dados de referência é usado como parâmetro de função, quando um objeto declarado p1 é passado, uma cópia do objeto p2 é realmente gerada. Este p2 aponta para p1, portanto, ao chamar os membros de p1 a p2, ele pode. ser concluída. Modifique, aguarde até que a chamada de função seja concluída e retenha a modificação. como:
classe Pessoa{
nome da string pública;
idade interna pública;
public Person(String nome,int idade){
este.nome = nome;
esta.idade = idade;
}
}
Teste de classe pública{
public static void main(String[] args){
Pessoa p = nova Pessoa("Zhang San", 10);
System.out.println("Antes da modificação-->Nome: "+ p.name+", Idade: "+p.age);
changePro(p); //O objeto p é passado e uma cópia de p é gerada. //Através desta cópia p1, membros de p podem ser chamados.
System.out.println("Após modificação-->Nome: "+ p.name+", Idade: "+p.age);
}
public static void changePro(Person p){ //Membros do objeto original podem ser chamados através da cópia
p.nome = "李思";
p.idade = 30;
}
}
resultado:
Antes da modificação -> Nome: Zhang San, idade: 10
Após modificação -> Nome: Li Si, idade: 30
Mas quando você passa p1, uma cópia de p2 é gerada e, em seguida, tentar alterar o apontamento de p1 para p2 é obviamente impossível. Neste momento, apenas o apontamento de p2 é alterado. de p1 permanece inalterado. como:
classe Pessoa{
nome da string pública;
idade interna pública;
public Person(String nome,int idade){
este.nome = nome;
esta.idade = idade;
}
}
Teste de classe pública{
public static void main(String[] args){
Pessoa p = nova Pessoa("Zhang San", 10);
System.out.println("Antes da modificação-->Nome: "+ p.name+", Idade: "+p.age);
changeObj(p); //O objeto p é passado, que é uma cópia de p. //Na função, apenas o ponteiro desta cópia é alterado.
System.out.println("Após modificação-->Nome: "+ p.name+", Idade: "+p.age);
}
public static Person newP = new Person("李思", 30);
public static void changeObj(Pessoa p){
p = newP; //Tenta alterar o ponteiro, mas o que realmente muda é o ponteiro da cópia.
//Após o término da função, o apontamento do objeto original não mudará
}
}
resultado:
Antes da modificação -> Nome: Zhang San, idade: 10
Após modificação -> Nome: Zhang San, idade: 10
2. Alocação dinâmica de memória
Em C++, new e delete são usados para alocar e reciclar memória dinamicamente. A novidade é abrir espaço na memória heap. Depois que a memória for usada, delete deve ser usado manualmente para reciclá-la.
Contanto que um tipo de dados de referência seja declarado em Java, new deve ser usado para abrir espaço de memória antes do uso. Mas depois que o objeto morre, não há necessidade de recuperar manualmente a memória. O próprio mecanismo de reciclagem de memória do Java reciclará automaticamente objetos de lixo (os chamados objetos de lixo referem-se à memória de objetos aberta anteriormente, que não é mais referenciada pela memória da pilha). Claro, a reciclagem manual também pode ser realizada através do método System.gc().
3. Destruidor
A função do destruidor C++ (sem parâmetros, sem valor de retorno) é liberar o espaço de memória alocado dinamicamente no construtor, ou seja, chamar (esta chamada pode ser chamada através do objeto. destruidor, ou o sistema pode esperar automaticamente até a vida útil do objeto termina.
Não há destruidor em Java e os objetos de lixo são reciclados automaticamente por meio do mecanismo de coleta de lixo. No entanto, você pode obter o mesmo efeito que o destruidor em C++ substituindo o método fanalize() na classe Object. Quando o objeto é destruído manual ou automaticamente, o método fanalize() será chamado automaticamente.
4. Conteúdo em classes vazias
A classe vazia de C++ deve ter 4 funções: construtor padrão, destruidor padrão e construtor de cópia padrão.
As classes vazias de Java incluem: construtor padrão, métodos herdados da classe Object, como
Atributos padrão em classes Existem três tipos de permissões de acesso de membros em classes C++: público>protegido>privado. Se não for declarada, a permissão padrão será privada.
Existem quatro tipos de permissões de acesso de membros em classes Java: público>protegido>defalt>privado. O padrão é a permissão padrão.
5. Implementação de funções-membro em classes
É habitual em C++. h A função é declarada na classe do arquivo de cabeçalho fora da classe; Para implementar a função no arquivo cpp, #include o arquivo de cabeçalho.
como:
//demo.h
Pessoa da turma{
Público:
Void fun(); //Declarado na classe
}
//demo.cpp
#incluir “demo.h”
Void Person::fun(){ //Implementação fora da classe
. . . . //corpo de implementação
}
Java é um método de declaração + implementação em uma classe. Se não for implementado em uma classe, adicionar a palavra-chave abstract é um método abstrato.
como:
classe Pessoa{
Public void fun(){//Declaração + implementação na classe
. . . . //corpo de implementação
}
}
6. Instanciação de objetos
classe Pessoa{
privado:
idade interna;
público:
Pessoa(){}
Pessoa(int a){
idade = uma;
}
diversão nula(){….}
}
. . . . //Início da função principal
Person p1; //O construtor sem parâmetros é chamado
Person p2(18); //Chama o construtor parametrizado
p1.fun(); //Chama a função membro
p2.fun();
Para instanciar um objeto em Java, você deve usar a palavra-chave new.
classe Pessoa{
nome da string privada;
idade interna privada;
Pessoa pública(){}
pessoa pública(String nome, int idade){
este.nome = nome;
esta.idade = idade;
}
diversão vazia pública() {…..}
}
. . . . . //Início da função principal
Pessoa p1 = nulo;
p1 = new Person(); //Você deve usar a palavra-chave new para abrir espaço de memória e chamar o construtor sem parâmetros.
Person p2 = new Person("Zhang San", 18); //Chama o construtor parametrizado.
p1.fun(); //Chamar método
p2.fun();
7. Esta palavra-chave
É chamado de ponteiro this em C++. Quando um objeto é instanciado, um ponteiro this será gerado por padrão para apontar para este objeto. Ele é usado pelo compilador para distinguir diferentes objetos da mesma classe. Isto é, como um objeto. Ao usar uma função de membro, você sabe qual objeto é por meio do ponteiro this e chama a função de membro para operar as propriedades de membro do objeto.
Isso tem três usos em Java:
1. Representa os atributos ou métodos desta classe. Tal como este. Método, isto. propriedade.
2. Representa o objeto atual.
3. Chame o método construtor desta classe. Tal como this(), this(parâmetro 1, parâmetro 2...).
[As funções dos usos 1 e 2 são semelhantes ao ponteiro this em C++. 】
8. Chamando membros do objeto
C++ passa objetos. Função de membro ou ponteiro de classe->função de membro a ser chamada.
Em Java, você só pode passar objetos. Chamada de função de membro.
Os membros do atributo Static dos dois podem ser passados diretamente pelo nome da classe. As funções-membro são chamadas diretamente.
9. Subclasse-->Classe pai, os parâmetros passados pelo construtor têm algo em comum: Se o construtor na subclasse não indicar claramente qual construtor da classe pai chamar, o sistema padrão chama o construtor sem parâmetros do pai aula. Ao mesmo tempo, se a classe pai definir um construtor com parâmetros, é melhor definir um construtor sem parâmetros.
classe Pessoa{
privado:
idade interna;
público:
Pessoa(){}
Pessoa(int a){
idade = uma;
}
}
classe Aluno: pessoa pública{
privado:
pontuação interna;
público:
Student(int a, int s):Person(a){ //Passa para o construtor da classe pai
pontuação = s;
}
}
classe Pessoa{
nome da string privada;
idade interna privada;
Pessoa pública(){}
pessoa pública(String nome, int idade){
este.nome = nome;
esta.idade = idade;
}
}
classe Aluno estende Pessoa{
pontuação interna privada;
public Student(String nome, int idade, pontuação int){
super(nome,idade); //passa para o construtor da classe pai
this.score = pontuação;
}
}
10. Polimorfismo
O polimorfismo em C++ deve ser alcançado por [função virtual ou função virtual pura + cobertura de subclasse de função virtual ou função virtual pura].
Funções virtuais são declaradas com virtual,
como:
virtual void fun(); //Declaração dentro da classe
nome da classe void: fun() {….}//implementação fora da classe
Java usa subclasses para substituir métodos comuns em classes pai comuns, subclasses para substituir métodos comuns ou métodos abstratos em classes abstratas e subclasses para substituir métodos abstratos em interfaces. +Transforme para cima.
Métodos abstratos são declarados com abstrato e não possuem implementação de conteúdo.
como:
abstract void fun(); //Nenhuma implementação dentro da classe
11. Classes abstratas Nenhuma classe abstrata pode instanciar objetos. Funções virtuais puras e métodos abstratos têm conceitos e funções semelhantes.
Pode-se dizer também que existem classes abstratas em C++, classes com funções virtuais puras.
Uma função virtual pura é uma função virtual sem implementação de conteúdo e "=0" e não pode instanciar objetos.
como:
virtual void fun() = 0; //Declarado como =0 dentro da classe, não é implementado fora da classe.
Uma classe abstrata em Java é uma classe declarada com a palavra-chave abstrata e contém métodos abstratos. O objeto não pode ser instanciado.
Uma interface em Java é uma classe especial ou uma classe abstrata especial. É composto por todas as constantes estáticas e funções abstratas.
12. Direitos de acesso
C++ usa três métodos de herança para alterar os direitos de acesso dos membros entre subclasses e classes pai.
classe Aluno: pessoa pública{
público:
. . . . . .
Privado:
. . . . . .
};
trabalhador de classe: pessoa protegida{
público:
. . . . . .
Privado:
. . . . . .
};
Agricultor de classe: pessoa física{
público:
. . . . . .
Privado:
. . . . . .
};
Java implementa permissões de acesso a membros entre diferentes classes por meio do mecanismo de pacote.
Pacote org.tyut.a
classe Pessoa{
privado…..
privado……
público…….
público…
}
pacote org.tuyt.b
classe Pessoa{
privado…..
privado……
público…….
público…
}
pacote org.tuyt.c
classe Pessoa{
privado…..
privado……
público…….
público…
}
13. A ideia do pré-processamento C++ e do pacote de importação Java é a mesma: quando você deseja usar uma classe diferente da classe atual,
Em C++, use a diretiva de pré-compilação #include antes da definição de classe para incluir a biblioteca de classes a ser incluída.
Bibliotecas de classes padrão usam colchetes < > sem h. Use aspas duplas "" com h na biblioteca de classes personalizadas e ele será pesquisado primeiro no caminho atual.
como:
#include <iostream>
#incluir “demo.h”
Em Java, para importar a classe que deseja utilizar, utilize o comando import e indique o pacote no qual a classe está localizada.
como:
imortar java. Lang. *;
importar organização. muito. *;