C++ 如何在C++;?

C++ 如何在C++;?,c++,static,C++,Static,是否可以在构造函数之外初始化静态常量值?是否可以在找到成员声明的同一位置初始化它 class A { private: static const int a = 4; /*...*/ }; 类的成员列表中静态数据成员的声明不是定义。必须在类声明之外的命名空间范围内定义静态成员。例如: class X { public: static int i; }; int X::i = 0; // definition outside class declaration 定义静态数

是否可以在构造函数之外初始化静态常量值?是否可以在找到成员声明的同一位置初始化它

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

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

class X
{
public:
      static int i;
};
int X::i = 0; // definition outside class declaration
定义静态数据成员后,即使静态数据成员的类中不存在任何对象,它也会存在。在上面的示例中,即使已定义静态数据成员X::i,也不存在类X的对象

命名空间范围中类的静态数据成员具有外部链接。静态数据成员的初始值设定项在声明该成员的类的作用域中

静态数据成员可以是除void或用const或volatile限定的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的成员无法访问它的成员

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

#include <iostream>
using namespace std;

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

const int X::a;

int main() {
  cout << X::a << endl;
}
#包括
使用名称空间std;
结构X{
静态常数INTA=76;
};
常数int X::a;
int main(){

cout不能在构造函数中初始化静态成员。整数类型可以在声明时内联初始化。必须在
.cpp
文件中定义其他静态成员:


可以,但只能用于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中删除,现在(有编译器提供此功能),您可以直接在类成员声明中初始化所需的内容。

为了完整起见,我添加了关于静态模板成员变量的内容

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

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

int main(){
   X<int> x;
}
模板结构X{
静态tx;
};
模板tx::X=T();
int main(){
X;
}

是的,您所拥有的功能有效(但仅适用于整型)。只是想补充一点,
static
与构造函数无关,因为
static
成员不是特定于给定实例的,并且存在于给定实例之外。事实上,您必须在类构造函数之外初始化const static。否则它就不是const static。DUCY?可能是@anarhikos-类initi中的@anarhikos的重复alization只适用于整型。
double
不是整型。@anrhikos:这就是为什么你不应该在类内定义的原因。你应该在类外定义,作为一种实践(参见我的答案)如果我不想赋值怎么办?如果我只想运行默认构造函数怎么办?如果我不赋值,我会在类外重新声明变量时出错。@anarhikos,你需要在static const(C++17)之前使用inline,或constexprIt,如果这个答案可以扩展到您在c++11或c++17中需要做的事情,那就太好了。基本上,将@Zhang的评论添加到回答中供共享!很难找到正确的语法。
template<class T> struct X{
   static T x;
};

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

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