如何在C ++中初始化静态const成员?

时间:2010-08-20 13:06:35

标签: c++ static

是否可以在构造函数之外初始化静态const值?是否可以在找到成员声明的同一地点进行初始化?

class A {
private:
  static const int a = 4;
  /*...*/
};

4 个答案:

答案 0 :(得分:68)

是的,你可以但只能用于int类型。 如果您希望静态成员是任何其他类型,则必须在cpp文件中的某处定义它。

class A{
private:
 static const int a = 4; // valid
 static const std::string t ; // can't be initialized here
 ...
 ...
};


// in a cpp file where the static variable will exist 
const std::string A::t = "this way it works";

另请注意,此规则已在C ++ 11中删除,现在(使用提供该功能的编译器)您可以直接在类成员声明中初始化您想要的内容。

答案 1 :(得分:32)

Static data members (C++ only)

类的成员列表中的静态数据成员的声明不是定义。您必须在命名空间范围内的类声明之外定义静态成员。例如:

class X
{
public:
      static int i;
};
int X::i = 0; // definition outside class declaration

一旦定义了静态数据成员,即使没有静态数据成员类的对象,它也存在。在上面的例子中,即使已经定义了静态数据成员X :: i,也不存在类X的对象。

命名空间范围内的类的静态数据成员具有外部链接。静态数据成员的初始化程序位于声明成员的类的范围内。

静态数据成员可以是任何类型,除了使用const或volatile限定的void或void。您不能将静态数据成员声明为可变。

程序中只能有一个静态成员的定义。未命名的类,未命名的类中包含的类和本地类不能包含静态数据成员。

静态数据成员及其初始值设定项可以访问其类的其他静态私有成员和受保护成员。以下示例显示了如何使用其他静态成员初始化静态成员,即使这些成员是私有的:

class C {
      static int i;
      static int j;
      static int k;
      static int l;
      static int m;
      static int n;
      static int p;
      static int q;
      static int r;
      static int s;
      static int f() { return 0; }
      int a;
public:
      C() { a = 0; }
      };

C c;
int C::i = C::f();    // initialize with static member function
int C::j = C::i;      // initialize with another static data member
int C::k = c.f();     // initialize with member function from an object
int C::l = c.j;       // initialize with data member from an object
int C::s = c.a;       // initialize with nonstatic data member
int C::r = 1;         // initialize with a constant value

class Y : private C {} y;

int C::m = Y::f();
int C::n = Y::r;
int C::p = y.r;       // error
int C::q = y.f();     // error

C :: p和C :: q的初始化会导致错误,因为y是从C私有派生的类的对象,而C的成员无法访问其成员。

如果静态数据成员是const integral或const枚举类型,则可以在静态数据成员的声明中指定常量初始值设定项。此常量初始值设定项必须是整型常量表达式。请注意,常量初始值设定项不是定义。您仍然需要在封闭的命名空间中定义静态成员。以下示例演示了这一点:

#include <iostream>
using namespace std;

struct X {
  static const int a = 76;
};

const int X::a;

int main() {
  cout << X::a << endl;
}

静态数据成员a声明结束时的标记= 76是一个常量初始值设定项。

答案 2 :(得分:13)

为了完整起见,我正在添加静态模板成员变量。

template<class T> struct X{
   static T x;
};

template<class T> T X<T>::x = T();

int main(){
   X<int> x;
}

答案 3 :(得分:6)

您无法在构造函数中初始化静态成员。可以在声明中内联初始化的整数类型。必须定义其他静态成员(在.cpp)文件中:

// .h
class A{
private:
 static const int a = 4;
 static const foo bar;
 ...
 ...
};

// .cpp
const foo A::bar = ...;