Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么静态成员需要在类外初始化_C++_Static - Fatal编程技术网

C++ 为什么静态成员需要在类外初始化

C++ 为什么静态成员需要在类外初始化,c++,static,C++,Static,当我打印它时,n的值为0。因此它是默认初始化的 如果是这样,那么需要什么?为什么编译器不能仅从类声明执行默认初始化?编译器可以清楚地看到类X有一个静态int成员n,为什么需要在类外定义它 谢谢。您所谓的初始化实际上是一个定义 原因是定义一次只能做一次 如果在头文件中定义了静态成员变量,则可以多次定义该变量 或者编译器不知道将定义放在哪个翻译单元中,因为它不知道其他可能的翻译单元。您所谓的初始化实际上是一个定义 原因是定义一次只能做一次 如果在头文件中定义了静态成员变量,则可以多次定义该变量 或者

当我打印它时,n的值为0。因此它是默认初始化的

如果是这样,那么需要什么?为什么编译器不能仅从类声明执行默认初始化?编译器可以清楚地看到类X有一个静态int成员n,为什么需要在类外定义它


谢谢。

您所谓的初始化实际上是一个定义

原因是定义一次只能做一次

如果在头文件中定义了静态成员变量,则可以多次定义该变量


或者编译器不知道将定义放在哪个翻译单元中,因为它不知道其他可能的翻译单元。

您所谓的初始化实际上是一个定义

原因是定义一次只能做一次

如果在头文件中定义了静态成员变量,则可以多次定义该变量


或者编译器不知道将定义放在哪个翻译单元中,因为它不知道其他可能的翻译单元。

类的所有对象都共享一个静态成员。如果没有其他初始化,则在创建第一个对象时,所有静态数据都初始化为零。我们不能将它放在类定义中,但它可以在类之外初始化,就像下面的示例中所做的那样,通过重新声明静态变量,使用scope resolution操作符::来标识它所属的类

试试下面的例子

int X::n;
#包括
使用名称空间std;
类框{
公众:
静态int对象计数;
//构造函数定义
盒子(双l=2.0,双b=2.0,双h=2.0){

cout静态成员由类的所有对象共享。如果不存在其他初始化,则在创建第一个对象时,所有静态数据都初始化为零。我们不能将其放入类定义中,但可以在类外初始化,如以下示例所示,通过使用作用域resol重新声明静态变量运算符::标识它所属的类

试试下面的例子

int X::n;
#包括
使用名称空间std;
类框{
公众:
静态int对象计数;
//构造函数定义
盒子(双l=2.0,双b=2.0,双h=2.0){

谢谢。如果我理解正确,我可以将类定义放在头文件中,然后我可以在多个翻译单元中使用这个类“X”,每个翻译单元将X::n初始化为不同的值?@madu-He的意思是定义“在整个程序中只能执行一次”,或者等效“一个翻译单元中只能有一个定义(而不能有其他定义)”谢谢你,M.M.我编辑了这个问题来反映这一点。现在我明白了。一个翻译单元基本上意味着一个程序。不是一个目标文件。@madu不,一个翻译单元基本上是一个源文件(包括所有标题)。即基本上成为目标文件的内容。当您将多个目标文件链接在一起时,可能只有一个定义,例如静态成员变量,分布在所有目标文件中。通常,此定义在单个目标文件中。谢谢。我对翻译单元有错误的想法。我认为单个目标文件是单个翻译每个转换单元都可以对静态变量进行自己的初始化。感谢您的澄清。谢谢。如果我理解正确,我可以将类定义放在头文件中,然后我可以在多个转换单元中使用此类“X”,每个转换单元将X::n初始化为不同的value?@madu-He的意思是定义“在整个程序中只能执行一次”,或者相当于“在一个翻译单元中只能有一个定义(而没有其他的)“谢谢,M.M.我编辑了这个问题来反映这一点。现在我明白了。一个翻译单元基本上意味着一个程序。不是一个目标文件。@madu不,翻译单元基本上是一个源文件(包括所有标题)。即基本上成为目标文件的内容。当您将多个目标文件链接在一起时,可能只有一个定义,例如静态成员变量,分布在所有目标文件中。通常,此定义在单个目标文件中。谢谢。我对翻译单元有错误的想法。我认为单个目标文件是单个翻译每个转换单元都可以有自己的静态变量初始化。谢谢你的澄清。你说的是定义。“初始化”这个词意思是提供一个初始值,而你在这里不这样做。人们回答。完全更改问题会使他们的答案无效,未来来这里的人不会真正了解他们的答案与问题有什么关系。如果你有一个新问题,顶部有一个按钮。我回滚了你的编辑。Y你说的是定义,“初始化”这个词意思是提供一个初始值,而你在这里不这样做。人们回答。完全更改问题会使他们的答案无效,未来来这里的人不会真正了解他们的答案与问题有什么关系。如果你有一个新问题,顶部有一个按钮。我回滚了你的编辑。
#include <iostream>

using namespace std;

class Box {
  public:
  static int objectCount;

  // Constructor definition
  Box(double l = 2.0, double b = 2.0, double h = 2.0) {
     cout <<"Constructor called." << endl;
     length = l;
     breadth = b;
     height = h;

     // Increase every time object is created
     objectCount++;
  }
  double Volume() {
     return length * breadth * height;
  }

 private:
  double length;     // Length of a box
  double breadth;    // Breadth of a box
  double height;     // Height of a box
 };

 // Initialize static member of class Box
 int Box::objectCount = 0;

int main(void) {
    Box Box1(3.3, 1.2, 1.5);    // Declare box1
    Box Box2(8.5, 6.0, 2.0);    // Declare box2

  // Print total number of objects.
   cout << "Total objects: " << Box::objectCount << endl;

  return 0;
 }