Video: mario (less comfortable) (C) 2024
Pengaturcaraan adalah semua tentang keterbacaan. Sukar (sebenarnya tidak mustahil) untuk menulis dan menyelenggara program yang tidak dapat anda baca. Sebahagian daripada membaca penyenaraian kod sumber memahami apa yang digunakan dalam perwakilan program. Bantuan paling asas yang diberikan oleh C ++ adalah #define di mana-mana, seperti contoh berikut:
#define PI 3. 141592653589793
Penyelesaian ini baik untuk nilai individu, walaupun ia menderita dari fakta bahawa Mekanisme #define tidak (tegasnya) sebahagian daripada C / C ++ sejak preprocessor berjalan sebelum pengkompil. Sebagai respons kepada itu, C ++ 2011 memperkenalkan ungkapan berterusan :
constexpr panjang ganda PI = 3. 141592653589793;
Kata kunci constexpr membawa pemalar ke dalam khemah C ++. PI ini mempunyai jenis sebenar, seperti pembolehubah C ++ yang lain. C ++ boleh menghasilkan mesej ralat dengan PI yang membuat lebih banyak akal daripada yang melibatkan 3. 14159.
Ungkapan malar adalah baik untuk nilai tetap individu, tetapi sering pemalar mewakili set perkara dan bukan pemalar semula jadi, seperti contoh berikut:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … dan sebagainya …
Kemungkinan pemalar ini digunakan untuk mengenal pasti negeri-negeri, mungkin digunakan sebagai indeks ke dalam pelbagai objek negeri atau sebagai nilai dalam pangkalan data di suatu tempat.
C ++ telah lama mempunyai mekanisme yang lebih baik untuk menentukan jenis pemalar ini - penghitungan:
enum STATE {DC_OR_TERRITORY, // mendapat 0 ALABAMA, // mendapat 1 ALASKA, // mendapat 2 ARKANSAS, // … dan jadi …};
Kata kunci enum memperkenalkan urutan pemalar yang dipanggil "penghitungan". Dalam hal ini, penghitungan itu membawa nama NEGARA. Setiap elemen penghitungan ini diberikan nilai bermula pada 0 dan bertambah secara berturutan oleh 1, jadi DC_OR_TERRITORY ditakrifkan sebagai 0, ALABAMA ditakrifkan sebagai 1, dan seterusnya. Anda boleh mengatasi jujukan tambahan ini dengan menggunakan pernyataan penyerah seperti berikut:
enum STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … dan sebagainya …};
Versi STATE ini menentukan unsur DC, yang diberi nilai 0. Ia kemudian menetapkan elemen TERRITORY yang baru, yang juga diberi nilai 0. ALABAMA mengambil 1, seperti sebelumnya.
Dalam praktiknya, pengaturcara boleh menggunakan penghitungan untuk menulis kod yang boleh dibaca seperti berikut:
double taxRate (NEGARA) {return taxRatesByState [s];}
Satu-satunya masalah dengan pendekatan ini ialah penghitungan ini tidak membuat jenis baru (seperti yang anda fikirkan).Malah, mengikut standard, STATE hanyalah nama lain untuk int - dan pemalar ALABAMA, ALASKA, dan sebagainya adalah semua jenis const int.
Pengkompil gcc sebenarnya menyediakan enum yang diisytiharkan dengan cara ini sedikit kuasa lebih daripada sekadar memanggilnya satu lagi bentuk int. Anda sebenarnya boleh memuatkan fungsi berdasarkan jenis enum:
void fn (STATE s); void fn (int n); fn (ALASKA); / / invokes fn (NEGERI)
Standard 2011 membolehkan pengaturcara untuk membuat jenis yang sama sekali baru menggunakan kata kunci enum. Oleh kerana pencipta piawai baru tidak mahu memecahkan kod yang ada, piawai itu memerlukan penambahan kata kunci tambahan untuk menentukan jenis pencacah, seperti contoh berikut:
kelas ENUM STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … dan sebagainya …};
Kelas penghitungan kini merupakan jenis skala penuh seperti mana-mana kelas yang ditentukan pengguna lain. Berikut ini tidak lagi sah lagi untuk dua sebab:
int s = ALASKA;
Pertama, ALASKA tetap hanya ditentukan dalam ruang nama STATE. Oleh itu, nama pemalar adalah NEGARA:: ALASKA. Kedua, jenis ini bukan int tetapi NEGARA. Anda tidak boleh memberikan nilai jenis STATE kepada int.
NEGARA s = NEGARA:: ALASKA;
Pengaturcara boleh mengembalikan NEGARA menjadi int tetapi dia mesti melakukannya dengan jelas-penukaran yang tidak jelas tidak memotongnya dengan kelas penghitungan:
int n = (int) NEGARA:: ALASKA;
Jenis enum baru ini juga boleh didasarkan pada salah satu daripada nombor nombor pengiraan lain selain hanya int:
enum class NEGARA: char {DC, // … sisa perisytiharan sama