Abstraksi data C++
Abstraksi data merujuk kepada hanya menyediakan maklumat penting kepada dunia luar dan menyembunyikan butiran pelaksanaan latar belakangnya, iaitu, hanya menunjukkan maklumat yang diperlukan tanpa mengemukakan butiran.
Abstraksi data ialah teknik pengaturcaraan (reka bentuk) yang bergantung pada pemisahan antara muka dan pelaksanaan.
Mari kita ambil contoh kehidupan sebenar, seperti televisyen, anda boleh menghidupkan dan mematikannya, menukar saluran, melaraskan kelantangan, menambah komponen luaran (seperti pembesar suara, VCR, pemain DVD), tetapi Anda tidak mengetahui butiran pelaksanaan dalamannya, iaitu, anda tidak tahu bagaimana ia menerima isyarat melalui kabel, menukar isyarat, dan akhirnya memaparkannya pada skrin.
Oleh itu, kita boleh mengatakan bahawa TV memisahkan pelaksanaan dalamannya dan antara muka luarannya Anda tidak perlu mengetahui prinsip pelaksanaan dalamannya, dan boleh terus menggunakan antara muka luarannya (seperti butang kuasa, alat kawalan jauh, kelantangan. pengawal ) untuk mengawal TV.
Sekarang, mari kita turun ke perniagaan Setakat pengaturcaraan C++, kelas C++ menyediakan kemungkinan untuk abstraksi data. Mereka menyediakan sejumlah besar kaedah awam untuk memanipulasi data objek kepada dunia luar, iaitu, dunia luar sebenarnya tidak mengetahui pelaksanaan dalaman kelas.
Sebagai contoh, atur cara anda boleh memanggil fungsi sort() tanpa mengetahui algoritma yang digunakan untuk mengisih data dalam fungsi tersebut. Malah, pelaksanaan asas pengisihan fungsi akan berbeza-beza bergantung pada versi perpustakaan Selagi antara muka kekal tidak berubah, panggilan fungsi akan berfungsi seperti biasa.
Dalam C++, kami menggunakan kelas untuk menentukan jenis data abstrak (ADT) kami sendiri. Anda boleh menggunakan cout objek kelas ostream untuk mengeluarkan data kepada output standard seperti berikut:
#include <iostream> using namespace std; int main( ) { cout << "Hello C++" <<endl; return 0; }
Di sini, anda tidak perlu memahami cout ialah cara teks dipaparkan pada skrin pengguna. Anda hanya perlu mengetahui antara muka awam, pelaksanaan asas cout boleh diubah secara bebas.
Teg akses memaksa abstraksi
Dalam C++, kami menggunakan teg akses untuk menentukan antara muka abstrak kelas. Kelas boleh mengandungi sifar atau lebih teg akses:
Ahli yang ditakrifkan dengan teg awam mempunyai akses kepada semua bahagian program. Pandangan abstrak jenis data ditakrifkan oleh ahli awamnya.
Ahli yang ditakrifkan menggunakan tag peribadi tidak boleh diakses daripada kod menggunakan kelas. Bahagian peribadi menyembunyikan butiran pelaksanaan daripada kod yang menggunakan jenis tersebut.
Tiada had pada kekerapan teg akses. Setiap teg akses menentukan tahap akses bagi definisi ahli yang mengikutinya. Tahap akses yang ditentukan kekal berkuat kuasa sehingga teg akses seterusnya ditemui atau kurungan penutup penutup badan kelas ditemui.
Faedah Abstraksi Data
Abstraksi data mempunyai dua kelebihan penting:
Bahan dalaman kelas dilindungi daripada Ralat peringkat pengguna yang tidak disengajakan menyebabkan objek negeri untuk dirosakkan.
Pelaksanaan kelas mungkin berubah dari semasa ke semasa sebagai tindak balas kepada keperluan yang berubah atau sebagai tindak balas kepada laporan pepijat yang tidak memerlukan perubahan pada kod peringkat pengguna.
Jika ahli data hanya ditakrifkan dalam bahagian peribadi kelas, pengarang kelas boleh menukar data sesuka hati. Jika pelaksanaan berubah, anda hanya perlu menyemak kod kelas untuk melihat kesan perubahan ini. Jika data adalah awam, sebarang fungsi yang mengakses secara langsung ahli data perwakilan lama mungkin terjejas.
Instance abstraksi data
Dalam program C++, mana-mana kelas dengan ahli awam dan persendirian boleh digunakan sebagai contoh abstraksi data. Lihat contoh berikut:
#include <iostream> using namespace std; class Adder{ public: // 构造函数 Adder(int i = 0) { total = i; } // 对外的接口 void addNum(int number) { total += number; } // 对外的接口 int getTotal() { return total; }; private: // 对外隐藏的数据 int total; }; int main( ) { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Total 60
Kelas di atas menambah nombor dan mengembalikan jumlahnya. Ahli awam addNum dan getTotal ialah antara muka luaran dan pengguna perlu mengenali mereka untuk menggunakan kelas. Ahli persendirian jumlah ialah sesuatu yang pengguna tidak perlu tahu tentangnya, tetapi diperlukan untuk kelas berfungsi dengan baik.
Strategi Reka Bentuk
Abstraksi memisahkan kod kepada antara muka dan pelaksanaan. Jadi apabila mereka bentuk komponen, anda mesti memastikan antara muka bebas daripada pelaksanaan, supaya jika pelaksanaan asas diubah, antara muka akan kekal tidak berubah.
Dalam kes ini, tidak kira program mana yang menggunakan antara muka, antara muka tidak akan terjejas, dan hanya pelaksanaan terkini perlu disusun semula.