Rumah > pembangunan bahagian belakang > C++ > Mengapakah Ahli Statik Bukan Konst atau Tatasusunan Statik Tidak Boleh Dimulakan Di Dalam Definisi Kelas dalam C ?

Mengapakah Ahli Statik Bukan Konst atau Tatasusunan Statik Tidak Boleh Dimulakan Di Dalam Definisi Kelas dalam C ?

Linda Hamilton
Lepaskan: 2024-12-06 05:00:11
asal
283 orang telah melayarinya

Why Can't Non-Const Static Members or Static Arrays Be Initialized Inside a Class Definition in C  ?

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;
};
Salin selepas log masuk

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 };
};
Salin selepas log masuk

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 };
};
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan