Pesan kesalahan dengan jelas mengatakan bahwa konstruktor default telah dihapus secara implisit . Ia bahkan mengatakan mengapa: kelas berisi variabel const non-statis, yang tidak akan diinisialisasi oleh ctor default.
class X {
const int x;
};
Karena X::x
itu const
, itu harus diinisialisasi - tetapi ctor default biasanya tidak menginisialisasi (karena ini adalah tipe POD). Oleh karena itu, untuk mendapatkan ctor default, Anda perlu mendefinisikannya sendiri (dan harus menginisialisasi x
). Anda bisa mendapatkan situasi yang sama dengan anggota yang menjadi referensi:
class X {
whatever &x;
};
Mungkin perlu dicatat bahwa keduanya juga akan menonaktifkan pembuatan implisit dari operator penugasan, karena alasan yang pada dasarnya sama. Operator penugasan implisit biasanya melakukan penugasan berdasarkan anggota, tetapi dengan anggota const atau anggota referensi, tidak dapat melakukannya karena anggota tersebut tidak dapat ditetapkan. Untuk membuat tugas berfungsi, Anda perlu menulis operator tugas Anda sendiri.
Inilah sebabnya mengapa seorang const
anggota biasanya harus statis - ketika Anda melakukan tugas, Anda tetap tidak dapat menetapkan anggota const. Dalam kasus umum, semua instance Anda akan memiliki nilai yang sama sehingga mungkin juga berbagi akses ke satu variabel daripada memiliki banyak salinan variabel yang semuanya akan memiliki nilai yang sama.
Tentu saja dimungkinkan untuk membuat instance dengan nilai yang berbeda - Anda (misalnya) memberikan nilai saat Anda membuat objek, sehingga dua objek yang berbeda dapat memiliki dua nilai yang berbeda. Namun, jika Anda mencoba melakukan sesuatu seperti menukar mereka, anggota const akan mempertahankan nilai aslinya alih-alih ditukar.