kelas enum (C++/CLI dan C++/CX)
Mendeklarasikan enumerasi pada cakupan namespace, yang merupakan jenis yang ditentukan pengguna yang terdiri dari sekumpulan konstanta bernama yang disebut enumerator.
Semua Runtime
Keterangan
C++/CX dan C++/CLI mendukung kelas enum publik dan kelas enum privat yang mirip dengan kelas enum C++ standar tetapi dengan penambahan penentu aksesibilitas. Di bawah /clr, jenis kelas enum C++11 diizinkan tetapi akan menghasilkan peringatan C4472 yang dimaksudkan untuk memastikan bahwa Anda benar-benar menginginkan jenis enum ISO dan bukan jenis C++/CX dan C++/CLI. Untuk informasi selengkapnya tentang kata kunci ISO Standard C++ enum
, lihat Enumerasi.
Windows Runtime
Sintaks
access
enum class
enumeration-identifier
[:underlying-type] { enumerator-list } [var];
accessenum structenumeration-identifier[:underlying-type] { enumerator-list } [var];
Parameter
Akses
Aksesibilitas enumerasi, yang dapat berupa public
atau private
.
pengidentifikasi enumerasi
Nama enumerasi.
jenis yang mendasar
(Opsional) Jenis enumerasi yang mendasar.
(Opsional. Hanya Windows Runtime) Jenis enumerasi yang mendasarinya, yang dapat berupa bool
, , , int16
char
char16
, uint16
, int
, uint32
, , int64
, atau .uint64
enumerator-list
Daftar nama enumerator yang dibatasi koma.
Nilai setiap enumerator adalah ekspresi konstanta yang didefinisikan secara implisit oleh kompilator, atau secara eksplisit oleh notasi, ekspresi konstanta enumerator=
. Secara default, nilai enumerator pertama adalah nol jika ditentukan secara implisit. Nilai setiap enumerator yang ditentukan secara implisit berikutnya adalah nilai enumerator sebelumnya + 1.
var
(Opsional) Nama variabel jenis enumerasi.
Keterangan
Untuk informasi selengkapnya, dan contohnya, lihat Enum.
Perhatikan bahwa pengkompilasi memancarkan pesan kesalahan jika ekspresi konstanta yang menentukan nilai enumerator tidak dapat diwakili oleh jenis yang mendasar. Namun, pengkompilasi tidak melaporkan kesalahan untuk nilai yang tidak pantas untuk jenis yang mendasar. Contohnya:
Jika jenis dasar adalah numerik, dan enumerator menentukan nilai maksimum untuk jenis tersebut, nilai enumerasi yang ditentukan secara implisit berikutnya tidak dapat diwakili.
Jika jenis yang mendasar adalah
bool
, dan lebih dari dua enumerator didefinisikan secara implisit, enumerator setelah dua pertama tidak dapat diwakili.Jika jenis yang mendasar adalah
char16
, dan nilai enumerasi berkisar dari 0xD800 hingga 0xDFFF, nilai dapat diwakili. Namun, nilai secara logis salah karena mewakili setengah pasangan pengganti Unicode dan tidak boleh muncul dalam isolasi.
Persyaratan
Opsi pengkompilasi: /ZW
Runtime Bahasa Umum
Sintaks
access
enum class
name [:type] { enumerator-list } var;
accessenum structname [:type] { enumerator-list } var;
Parameter
Akses
Aksesibilitas enum. Dapat berupa public
atau private
.
enumerator-list
Daftar pengidentifikasi (enumerator) yang dipisahkan koma dalam enumerasi.
nama
Nama enumerasi. Enumerasi terkelola anonim tidak diizinkan.
jenis
(Opsional) Jenis pengidentifikasi yang mendasar. Ini bisa berupa jenis skalar apa pun, seperti versi yang ditandatangani atau tidak ditandatangani dari int
, short
, atau long
. bool
atau char
juga diizinkan.
var
(Opsional) Nama variabel jenis enumerasi.
Keterangan
kelas enum dan struktur enum adalah deklarasi yang setara.
Ada dua jenis enum: terkelola atau C++/CX dan standar.
Enum C++/CX terkelola atau mungkin didefinisikan sebagai berikut,
public enum class day {sun, mon };
dan secara semantik setara dengan:
ref class day {
public:
static const int sun = 0;
static const int mon = 1;
};
Enum standar mungkin didefinisikan sebagai berikut:
enum day2 { sun, mon };
dan secara semantik setara dengan:
static const int sun = 0;
static const int mon = 1;
Nama enumerator terkelola (pengidentifikasi) tidak disuntikkan ke dalam cakupan di mana enumerasi ditentukan; semua referensi ke enumerator harus sepenuhnya memenuhi syarat (pengidentifikasi nama::
). Untuk alasan ini, Anda tidak dapat menentukan enum terkelola anonim.
Enumerator enum standar sangat disuntikkan ke dalam cakupan penutup. Artinya, jika ada simbol lain dengan nama yang sama dengan enumerator dalam cakupan penutup, kompilator akan menghasilkan kesalahan.
Di Visual Studio 2002 dan Visual Studio 2003, enumerator disuntikkan dengan lemah (terlihat dalam cakupan penutup kecuali ada pengidentifikasi lain dengan nama yang sama).
Jika enum C++ standar didefinisikan (tanpa class
atau struct
), mengkompilasi dengan /clr
akan menyebabkan enumerasi dikompilasi sebagai enum terkelola. Enumerasi masih memiliki semantik enumerasi yang tidak dikelola. Perhatikan, pengkompilasi menyuntikkan atribut, Microsoft::VisualC::NativeEnumAttribute
untuk mengidentifikasi niat programmer agar enum menjadi enum asli. Kompilator lain hanya akan melihat enum standar sebagai enum terkelola.
Enum standar bernama yang dikompilasi /clr
akan terlihat di rakitan sebagai enum terkelola, dan dapat dikonsumsi oleh pengkompilasi terkelola lainnya. Namun, enum standar yang tidak disebutkan namanya tidak akan terlihat secara publik dari rakitan.
Di Visual Studio 2002 dan Visual Studio 2003, enum standar yang digunakan sebagai jenis dalam parameter fungsi:
// mcppv2_enum.cpp
// compile with: /clr
enum E { a, b };
void f(E) {System::Console::WriteLine("hi");}
int main() {
E myi = b;
f(myi);
}
akan mengeluarkan yang berikut ini di MSIL untuk tanda tangan fungsi:
void f(int32);
Namun, dalam versi pengkompilasi saat ini, enum standar dipancarkan sebagai enum terkelola dengan [NativeEnumAttribute] dan yang berikut di MSIL untuk tanda tangan fungsi:
void f(E)
Untuk informasi selengkapnya tentang enum asli, lihat Deklarasi Enumerasi C++.
Untuk informasi selengkapnya tentang enum CLR, lihat:
Persyaratan
Opsi pengkompilasi: /clr
Contoh
// mcppv2_enum_2.cpp
// compile with: /clr
// managed enum
public enum class m { a, b };
// standard enum
public enum n { c, d };
// unnamed, standard enum
public enum { e, f } o;
int main()
{
// consume managed enum
m mym = m::b;
System::Console::WriteLine("no automatic conversion to int: {0}", mym);
System::Console::WriteLine("convert to int: {0}", (int)mym);
// consume standard enum
n myn = d;
System::Console::WriteLine(myn);
// consume standard, unnamed enum
o = f;
System::Console::WriteLine(o);
}
no automatic conversion to int: b
convert to int: 1
1
1
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk