saya ada kelas
class foo {
public:
foo();
foo( int );
private:
static const string s;
};
Di mana tempat terbaik untuk menginisialisasi string s
dalam file sumber?
c++
static
initialization
constants
Thomas
sumber
sumber
i
harus didefinisikan dalam cpp. §9.4.2 / 4 Jika anggota data statis adalah tipe const integral atau enumeration, pernyataannya dalam definisi kelas dapat menentukan penginisialisasi konstan yang harus berupa ekspresi konstanta integral (5.19). Dalam hal itu, anggota dapat muncul dalam ekspresi konstan integral. Anggota masih harus didefinisikan dalam lingkup ruang nama jika digunakan dalam program dan definisi ruang lingkup namespace tidak boleh berisi penginisialisasi.i
harus didefinisikan hanya jika digunakan di tempat lain selain dalam ekspresi konstan yang tidak terpisahkan, kan? Dalam hal ini Anda tidak dapat mengatakan bahwa ada kesalahan karena tidak ada konteks yang cukup untuk memastikan - atau dengan tegas mengatakan contoh di atas adalah benar jika tidak ada kode lain. Sekarang saya sangat menghargai komentar Anda (+1), saya masih belajar sendiri! Jadi saya akan mencoba menjelaskan poin itu dalam jawaban, tolong beri tahu saya jika itu lebih baik ...int f() { return 42; } class foo { static const int i = f(); /* Error! */ }
Perhatikan bahwa C ++ 11 memungkinkan memanggil fungsi 'constexpr':constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
Anggota statis perlu diinisialisasi dalam unit terjemahan .cpp pada ruang lingkup file atau dalam namespace yang sesuai:
sumber
Di unit terjemahan dalam namespace yang sama, biasanya di atas:
sumber
Sejak C ++ 17 specifier sebaris juga berlaku untuk variabel. Anda sekarang dapat mendefinisikan variabel anggota statis dalam definisi kelas:
sumber
Hanya nilai integral (mis.,
static const int ARRAYSIZE
) Diinisialisasi dalam file header karena mereka biasanya digunakan dalam header kelas untuk mendefinisikan sesuatu seperti ukuran array. Nilai-nilai non-integral diinisialisasi dalam file implementasi.sumber