Bagikan melalui


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, , , int16charchar16, 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

Ekstensi Komponen untuk .NET dan UWP