Mengapa Ahli Statik Bukan Konst atau Tatasusunan Statik Tidak Boleh Dimulakan dalam Kelas?
Dalam kelas, ahli data statik boleh hanya boleh dimulakan jika ia adalah malar dan jenis kamiran. Sekatan ini timbul daripada keperluan standard C bahawa setiap objek mempunyai definisi yang unik.
Permulaan Ahli Statik Bukan Konst:
Mengikut piawaian C (C 03 9.4 .2), ahli data statik jenis bukan const tidak boleh dimulakan dalam definisi kelas. Kod berikut menggambarkan ini:
class A { static int b = 3; };
Kod ini melanggar standard dan akan menghasilkan ralat, kerana ahli statik b bukan const dan cuba untuk memulakannya dalam kelas.
Permulaan Tatasusunan Statik:
Begitu juga, tatasusunan statik tidak boleh dimulakan dalam kelas takrifan, walaupun ia adalah const. Ini disebabkan oleh fakta bahawa tatasusunan statik disimpan dalam ingatan sebagai objek. Oleh itu, mereka tidak boleh dimulakan dalam definisi kelas, kerana ia akan melanggar keperluan untuk definisi unik.
class A { static const int c[2] = { 1, 2 }; };
Sekali lagi, kod ini melanggar standard dan akan menghasilkan ralat.
Penyelesaian dan Sebab:
Satu penyelesaian untuk memulakan tatasusunan statik dalam kelas melibatkan penggunaan "helah enum," seperti berikut:
class A { static const int a = 3; enum { arrsize = 2 }; static const int c[arrsize] = { 1, 2 }; };
Sebab di sebalik larangan pada permulaan dalam kelas ahli data statik adalah berkaitan dengan fakta bahawa fail pengepala yang mengandungi pengisytiharan kelas biasanya disertakan ke dalam berbilang unit terjemahan. Untuk mengelakkan isu penyambung, C memerlukan setiap objek mempunyai definisi yang unik. Jika permulaan dalam kelas entiti pemastautin memori dibenarkan, peraturan ini akan dilanggar.
Walau bagaimanapun, dalam C 11, sekatan telah dilonggarkan sedikit sebanyak. Jika ahli data statik adalah daripada jenis literal const, ia boleh dimulakan menggunakan pendakap-atau-sama-inisial dalam definisi kelas. Selain itu, ahli data bukan statik kini boleh dimulakan pada titik pengisytiharan. Ciri ini belum lagi dilaksanakan sepenuhnya dalam semua penyusun, seperti gcc 4.7.
Atas ialah kandungan terperinci Mengapakah Ahli Statik Bukan Konst atau Tatasusunan Statik Tidak Boleh Dimulakan Di Dalam Definisi Kelas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!