-
Persamaan dan perbedaan antara C++ dan Java
1. Penunjuk ★★★★★
Pointer dalam C C++ memberikan fleksibilitas yang besar, namun fleksibilitas juga membawa bahaya. Pengoperasian pointer yang tidak tepat dapat dengan mudah menyebabkan masalah seperti kebocoran memori atau pointer yang menggantung.
Java membatalkan pointer. Namun faktanya, nama semua tipe data referensi yang dideklarasikan di Java dapat dipahami sebagai sebuah pointer. Nama tersebut disimpan dalam memori tumpukan dan menunjuk ke ruang yang baru dibuka di memori.
menyukai:
int[] larik = int baru[10]
Array nama array bilangan bulat ada di memori tumpukan, dan ruang 10*4 byte dibuka di memori tumpukan, dan array menunjuk ke blok memori.
Array dapat dipahami sebagai sebuah pointer, dan alamat yang disimpan di dalamnya adalah ruang yang dibuat oleh yang baru.
menyukai:
Orang kelas{
…
}
Orang p = Orang baru();
Nama objek p dibuka di memori tumpukan, dan new digunakan untuk membuka ruang di memori tumpukan untuk objek tersebut.
Namun nyatanya, namanya tidak seperti pointer di C++, terutama saat meneruskan parameter.
Java telah menyatakan bahwa penerusan parameter didasarkan pada nilai.
Tapi ketika tipe data referensi digunakan sebagai parameter fungsi, ketika objek p1 yang dideklarasikan diteruskan, salinan objek p2 sebenarnya dihasilkan. P2 ini menunjuk ke p1, jadi ketika memanggil anggota p1 melalui p2, itu bisa selesai. Modifikasi, tunggu hingga pemanggilan fungsi selesai, dan simpan modifikasinya. menyukai:
Orang kelas{
nama String publik;
usia publik;
Orang Publik(Nama string,int umur){
ini.nama = nama;
this.usia = usia;
}
}
Tes kelas publik{
public static void main(String[] args){
Orang p = Orang baru("Zhang San", 10);
System.out.println("Sebelum modifikasi-->Nama: "+ p.nama+", Umur: "+p.usia);
changePro(p); //Objek p diteruskan, dan salinan p dihasilkan. //Melalui salinan p1 ini, anggota p dapat dipanggil.
System.out.println("Setelah modifikasi-->Nama: "+ p.nama+", Umur: "+p.usia);
}
public static void changePro(Person p){ //Anggota objek asli dapat dipanggil melalui salinan
p.nama = "李思";
hal.usia = 30;
}
}
hasil:
Sebelum modifikasi-->Nama: Zhang San, usia: 10
Setelah modifikasi-->Nama: Li Si, umur: 30
Tetapi ketika Anda memasukkan p1, salinan p2 dibuat, dan kemudian mencoba mengubah penunjukan p1 melalui p2 jelas tidak mungkin. Saat ini, hanya penunjukan p2 yang diubah dari p1 tetap tidak berubah. menyukai:
Orang kelas{
nama String publik;
usia publik;
Orang Publik(Nama string,int umur){
ini.nama = nama;
this.usia = usia;
}
}
Tes kelas publik{
public static void main(String[] args){
Orang p = Orang baru("Zhang San", 10);
System.out.println("Sebelum modifikasi-->Nama: "+ p.nama+", Umur: "+p.usia);
changeObj(p); //Objek p dilewatkan, yang merupakan salinan dari p. Asumsikan itu adalah p1, yang menunjuk ke p. //Dalam fungsinya, hanya penunjuk salinan ini yang diubah.
System.out.println("Setelah modifikasi-->Nama: "+ p.nama+", Umur: "+p.usia);
}
publik statis Orang newP = Orang baru("李思", 30);
public static void changeObj(Orang p){
p = newP; //Mencoba mengubah penunjuk, tetapi yang sebenarnya berubah adalah penunjuk salinannya.
//Setelah fungsi berakhir, penunjukan objek asli tidak akan berubah
}
}
hasil:
Sebelum modifikasi-->Nama: Zhang San, usia: 10
Setelah modifikasi-->Nama: Zhang San, usia: 10
2. Alokasi memori dinamis
Di C++, new dan delete digunakan untuk mengalokasikan dan mendaur ulang memori secara dinamis. New adalah untuk membuka ruang pada memori heap. Setelah memori digunakan, delete harus digunakan secara manual untuk mendaur ulangnya.
Selama tipe data referensi dideklarasikan di Java, new harus digunakan untuk membuka ruang memori sebelum digunakan. Namun setelah objek mati, tidak perlu mengambil kembali memori secara manual. Mekanisme daur ulang memori Java sendiri akan secara otomatis mendaur ulang objek sampah (yang disebut objek sampah mengacu pada memori objek yang dibuka sebelumnya, yang tidak lagi direferensikan oleh memori tumpukan). Tentu saja, daur ulang manual juga dapat dilakukan melalui metode System.gc().
3. Destruktor
Fungsi destruktor C++ (tanpa parameter, tanpa nilai balik) adalah untuk melepaskan ruang memori yang dialokasikan secara dinamis di konstruktor, yaitu untuk memanggil (panggilan ini dapat dipanggil melalui objek. destruktor, atau sistem dapat secara otomatis menunggu hingga objek seumur hidup berakhir.
Tidak ada destruktor di Java, dan objek sampah secara otomatis didaur ulang melalui mekanisme pengumpulan sampah. Namun, Anda dapat mencapai efek yang sama seperti destruktor di C++ dengan mengganti metode fanalize() di kelas Object. Ketika objek dimusnahkan secara manual atau otomatis, metode fanalize() akan dipanggil secara otomatis.
4. Isi kelas kosong
Kelas C++ yang kosong harus memiliki 4 fungsi: konstruktor default, destruktor default, dan konstruktor salinan default.
Kelas kosong Java meliputi: konstruktor default, metode yang diwarisi dari kelas Object, seperti
Atribut default di kelas Ada tiga jenis izin akses anggota di kelas C++: publik>dilindungi>pribadi. Jika tidak dideklarasikan, izin defaultnya adalah pribadi.
Ada empat jenis izin akses anggota di kelas Java: publik>dilindungi>defalt>pribadi. Defaultnya adalah izin default.
5. Penerapan fungsi anggota di kelas
Ini adalah kebiasaan di C++. h Fungsi tersebut dideklarasikan di kelas file header di luar kelas. Untuk mengimplementasikan fungsi dalam file cpp, #sertakan file header.
menyukai:
//demo.h
Anggota Kelas{
Publik:
Void fun(); //Dideklarasikan di kelas
}
//demo.cpp
#sertakan “demo.h”
Void Person::fun(){ //Implementasi di luar kelas
. . . . //badan implementasi
}
Java adalah metode deklarasi + implementasi di kelas. Jika tidak diimplementasikan di kelas, menambahkan kata kunci abstrak adalah metode abstrak.
menyukai:
Orang kelas{
Public void fun(){//Deklarasi + implementasi di kelas
. . . . //badan implementasi
}
}
6. Instansiasi objek
Orang kelas{
pribadi:
ke dalam usia;
publik:
Orang(){}
Orang(int a){
umur = sebuah ;
}
membatalkan kesenangan(){….}
}
. . . . //Awal dari fungsi utama
Orang p1; //Konstruktor tanpa parameter dipanggil
Orang p2(18); //Panggil konstruktor berparameter
p1.fun(); //Panggil fungsi anggota
p2.menyenangkan();
Untuk membuat instance objek di Java, Anda harus menggunakan kata kunci new.
Orang kelas{
nama String pribadi;
usia int pribadi;
Orang Publik(){}
Orang publik(Nama string, usia int){
ini.nama = nama;
this.usia = usia;
}
kesenangan kekosongan publik() {…..}
}
. . . . . //Awal dari fungsi utama
Orang p1 = null ;
p1 = new Person(); //Anda harus menggunakan kata kunci new untuk membuka ruang memori dan memanggil konstruktor tanpa parameter.
Person p2 = new Person("Zhang San", 18); //Panggil konstruktor yang diparameterisasi.
p1.fun(); //Metode panggilan
p2.menyenangkan();
7. Kata kunci ini
Disebut penunjuk ini di C++. Ketika suatu objek dipakai, penunjuk ini akan dihasilkan secara default untuk menunjuk ke objek ini. Ini digunakan oleh kompiler untuk membedakan objek berbeda dari kelas yang sama. Artinya, sebagai sebuah objek. Saat menggunakan fungsi anggota, Anda mengetahui objek mana melalui penunjuk ini, dan memanggil fungsi anggota untuk mengoperasikan properti anggota objek.
Ini memiliki tiga kegunaan di Java:
1. Mewakili atribut atau metode yang ada di kelas ini. Seperti ini. Metode, ini. milik.
2. Mewakili objek saat ini.
3. Panggil metode konstruktor kelas ini. Seperti ini(), ini(parameter 1, parameter 2...).
[Fungsi penggunaan 1 dan 2 mirip dengan penunjuk ini di C++. 】
8. Memanggil anggota objek
C++ meneruskan objek. Fungsi anggota, atau penunjuk kelas->fungsi anggota untuk dipanggil.
Di Java, Anda hanya bisa meneruskan objek. Panggilan fungsi anggota.
Anggota atribut Statis keduanya dapat langsung diteruskan melalui nama kelas. Fungsi anggota dipanggil secara langsung.
9. Subkelas-->Kelas induk, parameter yang diteruskan oleh konstruktor memiliki kesamaan: Jika konstruktor di subkelas tidak secara jelas menunjukkan konstruktor kelas induk mana yang akan dipanggil, sistem secara default akan memanggil konstruktor induk tanpa parameter kelas. Pada saat yang sama, jika kelas induk mendefinisikan konstruktor dengan parameter, yang terbaik adalah mendefinisikan konstruktor tanpa parameter.
Orang kelas{
pribadi:
ke dalam usia;
publik:
Orang(){}
Orang(int a){
umur = sebuah ;
}
}
Kelas Siswa: Orang Publik{
pribadi:
skor int;
publik:
Student(int a, int s):Person(a){ //Lulus ke konstruktor kelas induk
skor = s;
}
}
Orang kelas{
nama String pribadi;
usia int pribadi;
Orang Publik(){}
Orang publik(Nama string, usia int){
ini.nama = nama;
this.usia = usia;
}
}
kelas Siswa memperluas Person{
skor int pribadi;
Siswa publik(Nama string, usia int, skor int){
super(nama,umur); //meneruskan ke konstruktor kelas induk
this.score = skor;
}
}
10. Polimorfisme
Polimorfisme dalam C++ harus dicapai dengan [fungsi virtual atau fungsi virtual murni + cakupan subkelas fungsi virtual atau fungsi virtual murni].
Fungsi virtual dideklarasikan dengan virtual,
menyukai:
virtual void fun(); //Deklarasi di dalam kelas
nama kelas batal: fun() {….}//implementasi di luar kelas
Java menggunakan subkelas untuk mengganti metode biasa di kelas induk biasa, subkelas untuk mengganti metode biasa atau metode abstrak di kelas abstrak, dan subkelas untuk mengganti metode abstrak di antarmuka. + Transformasi ke atas.
Metode abstrak dideklarasikan dengan abstrak dan tidak memiliki implementasi konten.
menyukai:
abstract void fun(); //Tidak ada implementasi di dalam kelas
11. Kelas abstrak Tidak ada kelas abstrak yang dapat membuat instance objek. Fungsi virtual murni dan metode abstrak memiliki konsep dan fungsi serupa.
Dapat juga dikatakan bahwa ada kelas abstrak di C++, kelas dengan fungsi virtual murni.
Fungsi virtual murni adalah fungsi virtual tanpa implementasi konten dan "=0", dan tidak dapat membuat instance objek.
menyukai:
virtual void fun() = 0; //Dideklarasikan sebagai =0 di dalam kelas, tidak diimplementasikan di luar kelas.
Kelas abstrak di Java adalah kelas yang dideklarasikan dengan kata kunci abstrak dan berisi metode abstrak. Objek tidak dapat dipakai.
Antarmuka di Java adalah kelas khusus, atau kelas abstrak khusus. Ini terdiri dari semua konstanta statis dan fungsi abstrak.
12. Hak akses
C++ menggunakan tiga metode pewarisan untuk mengubah hak akses anggota antara subkelas dan kelas induk.
Kelas Siswa: Orang Publik{
publik:
. . . . . .
Pribadi:
. . . . . .
};
pekerja kelas: Orang yang dilindungi{
publik:
. . . . . .
Pribadi:
. . . . . .
};
Petani kelas: Orang pribadi{
publik:
. . . . . .
Pribadi:
. . . . . .
};
Java mengimplementasikan izin akses kepada anggota antar kelas yang berbeda melalui mekanisme paket.
Paket org.tyut.a
Orang kelas{
pribadi…..
pribadi……
publik…….
publik…
}
paket org.tuyt.b
Orang kelas{
pribadi…..
pribadi……
publik…….
publik…
}
paket org.tuyt.c
Orang kelas{
pribadi…..
pribadi……
publik…….
publik…
}
13. Ide paket C++ preprocessing & java import sama: ketika Anda ingin menggunakan kelas selain kelas saat ini,
Di C++, gunakan direktif prakompilasi #include sebelum definisi kelas untuk menyertakan perpustakaan kelas yang akan disertakan.
Perpustakaan kelas standar menggunakan tanda kurung sudut < > tanpa h. Gunakan tanda kutip ganda "" dengan h di perpustakaan kelas khusus, dan itu akan dicari dari jalur saat ini terlebih dahulu.
menyukai:
#termasuk <iostream>
#sertakan “demo.h”
Di Java, untuk mengimpor kelas yang ingin Anda gunakan, gunakan perintah import dan tunjukkan paket di mana kelas tersebut berada.
menyukai:
imor java. Lang. *;
organisasi impor. sial. *;