Video: Enumerasi TSP/PSP NusaBarung 2024
Pemrograman adalah semua tentang keterbacaan. Ini sulit (sebenarnya tidak mungkin) menulis dan memelihara program yang tidak bisa Anda baca. Bagian dari membaca daftar kode sumber adalah memahami apa yang digunakan dalam program. Bantuan paling dasar yang diberikan C ++ adalah #define yang ada di mana-mana, seperti contoh berikut yang dikutip:
#define PI 3. 141592653589793
Solusi ini tidak masalah untuk nilai individual, meskipun ia merasa bahwa #define mekanisme tidak (benar-benar berbicara) bagian dari C / C + + sejak preprocessor berjalan sebelum compiler. Sebagai tanggapan terhadap hal tersebut, C ++ 2011 memperkenalkan konstruk konstan :
constexpr long double PI = 3. 141592653589793;
Kata kunci constexpr membawa konstanta ke dalam tenda C + +. PI ini memiliki tipe yang nyata, seperti variabel C ++ lainnya. C ++ dapat menghasilkan pesan kesalahan dengan PI yang lebih masuk akal daripada yang melibatkan 3. 14159.
Ungkapan konstan baik untuk nilai konstan individu, namun sering kali konstanta mewakili himpunan benda dan bukan konstanta alami, seperti pada contoh berikut:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … dan seterusnya …
Mungkin konstanta ini digunakan untuk mengidentifikasi negara bagian, mungkin digunakan sebagai sebuah indeks ke dalam array objek negara atau sebagai nilai dalam database di suatu tempat.
C ++ telah lama memiliki mekanisme yang lebih baik untuk menentukan jenis konstanta ini - enumerasi:
enum STATE {DC_OR_TERRITORY, // mendapatkan 0 ALABAMA, // mendapatkan 1 ALASKA, // mendapatkan 2 ARKANSAS, // … dan seterusnya …};
Kata kunci enum mengenalkan rangkaian konstanta yang disebut "enumerasi". Dalam hal ini, pencacahan tersebut membawa nama NEGARA. Setiap elemen dari enumerasi ini diberi nilai mulai dari 0 dan meningkat secara berurutan sebesar 1, jadi DC_OR_TERRITORY didefinisikan sebagai 0, ALABAMA didefinisikan sebagai 1, dan seterusnya. Anda dapat mengganti urutan tambahan ini dengan menggunakan pernyataan assign sebagai berikut:
enum STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … dan seterusnya …};
Versi NEGARA ini mendefinisikan sebuah elemen DC, yang diberi nilai 0. Kemudian mendefinisikan elemen baru TERRITORY, yang juga diberi nilai 0. ALABAMA mengambil 1, sama seperti sebelumnya.
Dalam prakteknya, pemrogram dapat menggunakan enumerasi untuk menulis kode yang cukup mudah dibaca seperti berikut ini:
pajak dua kali pajak (NEGARA) {return tax pricesByState [s];}
Satu-satunya masalah dengan pendekatan ini adalah bahwa penghitungan ini tidak menciptakan tipe baru (seperti yang mungkin Anda pikirkan).Sebenarnya, menurut standarnya, STATE hanyalah nama lain untuk int - dan konstanta ALABAMA, ALASKA, dan seterusnya adalah tipe int const.
Kompiler gcc sebenarnya menyediakan enum yang dideklarasikan dengan cara ini sedikit lebih banyak otoritas daripada hanya menyebutnya bentuk int lain. Anda sebenarnya dapat membebani fungsi berdasarkan tipe enum:
void fn (STATE s); void fn (int n); fn (ALASKA); // invokes fn (STATE)
Standar 2011 memungkinkan programmer membuat tipe yang sama sekali baru dengan menggunakan kata kunci enum. Karena pencipta standar baru tidak ingin melanggar kode yang ada, standar memerlukan penambahan kata kunci tambahan untuk menentukan jenis enumerasi, seperti pada contoh berikut:
kelas enum NEGARA {DC, TERRITORY = 0, ALABAMA, ALASKA, // … dan seterusnya …};
Kelas enumerasi sekarang merupakan tipe skala penuh seperti kelas yang ditentukan pengguna lainnya. Hal berikut ini bahkan tidak legal lagi karena dua alasan:
int s = ALASKA;
Pertama, ALASKA konstan hanya didefinisikan dalam namespace NEGARA. Dengan demikian, nama konstanta adalah NEGARA:: ALASKA. Kedua, tipe tidak int tapi STATE. Anda tidak dapat menetapkan nilai tipe STATE ke int.
NEGARA s = NEGARA:: ALASKA;
Pemrogram dapat menyusun ulang sebuah STATE ke int tapi dia harus melakukannya secara eksplisit - sedikitpun konversi tidak memotongnya dengan kelas enumerasi:
int n = (int) STATE:: ALASKA;
Jenis enum baru ini juga dapat didasarkan pada salah satu tipe nomor penghitungan lainnya selain hanya int:
kelas enum NEGARA: char {DC, // … sisa deklarasi sama