Yanıtlar:
Bir derleme biriminin herhangi bir yerinde (genellikle bir .cpp dosyası) şunları yapacaktır:
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;
(*) Standartlara göre , kodda sadece integral sabit ifadeler dışında kullanılıyorsa i, sınıf tanımının dışında (olduğu gibi j) tanımlamalısınız . Ayrıntılar için aşağıdaki David'in yorumuna bakın.
itanımlanması gerekecek gibi görünüyor , değil mi? Bu durumda, emin olmak için yeterli bağlam olmadığı için bir hata olduğunu söyleyemezsiniz - ya da katı bir şekilde konuşmak gerekirse, yukarıdaki örnek başka bir kod yoksa doğrudur. Şimdi yorumunuzu takdir ediyorum (+1), hala bir şeyler öğreniyorum! Bu yüzden cevaptaki bu noktayı açıklığa kavuşturmaya çalışacağım, lütfen daha iyi olup olmadığını bana bildirin ...
int f() { return 42; } class foo { static const int i = f(); /* Error! */ }C ++ 11'in 'constexpr' işlevlerinin çağrılmasına izin verdiğini unutmayın:constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
Statik üyelerin dosya kapsamında veya uygun ad alanında bir .cpp çeviri biriminde başlatılması gerekir:
const string foo::s( "my foo");
Aynı ad alanı içindeki bir çeviri biriminde, genellikle en üstte:
// 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;
}
Yalnızca integral değerler (örneğin static const int ARRAYSIZE) başlık dosyasında başlatılır çünkü bunlar genellikle bir dizinin boyutu gibi bir şeyi tanımlamak için sınıf başlığında kullanılır. İntegral olmayan değerler uygulama dosyasında başlatılır.
iedilmelidir tanımlanan cpp'de içinde. §9.4.2 / 4 Bir statik veri üyesi, const integral veya sabit numaralandırma