Jawaban:
Di mana saja dalam satu unit kompilasi (biasanya file .cpp) akan melakukan:
foo.h
class foo {
static const string s; // Can never be initialized here.
static const char* cs; // Same with C strings.
static const int i = 3; // Integral types can be initialized here (*)...
static const int j; // ... OR in cpp.
};
foo.cpp
#include "foo.h"
const string foo::s = "foo string";
const char* foo::cs = "foo C string";
// No definition for i. (*)
const int foo::j = 4;
(*) Menurut standar Anda harus mendefinisikan di i
luar definisi kelas (seperti j
adalah) jika digunakan dalam kode selain dari ekspresi konstan yang tidak terpisahkan. Lihat komentar David di bawah untuk detailnya.
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:
const string foo::s( "my foo");
Di unit terjemahan dalam namespace yang sama, biasanya di atas:
// foo.h
struct foo
{
static const std::string s;
};
// foo.cpp
const std::string foo::s = "thingadongdong"; // this is where it lives
// bar.h
namespace baz
{
struct bar
{
static const float f;
};
}
// bar.cpp
namespace baz
{
const float bar::f = 3.1415926535;
}
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.
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.