在主函数内初始化静态类变量

7

我在类中有一个静态变量。 我在全局范围内进行初始化,它可以正常工作。

但是, 当我尝试在主函数中进行初始化时,链接器会抛出错误。 为什么会这样呢?

class Myclass{

    static int iCount;
} ;

int main(){

  int Myclass::iCount=1;

}

在全局范围内,为什么我需要指定变量类型,比如:
int Myclass::iCount=1;

在我的课堂上,我将iCount定义为整数类型,为什么不这样做呢?

   Myclass::iCount =1 ; in //Global scope

@goreSplatter:Myclass::iCount 不是公共的,它会失败。 - peoro
@goreSplatter:就像@peoro所说的那样,即使它是公共的,那也只是一个赋值而不是初始化 - Clifford
@peoro:私有静态数据成员的初始化不会失败!!但是其他访问,例如赋值,会失败。 - Nawaz
@Nawaz:你没有读到我回答的评论。建议在“main”中放置Myclass::iCount=1; - peoro
@peoro:你是在谈论赋值还是初始化? - Nawaz
@Nawaz:这是一个赋值操作,因为初始化不能在函数内完成。 - peoro
5个回答

5
C++标准中的第9.4.2/7节规定:
静态数据成员的初始化和销毁与非局部对象完全相同(参见3.6.2、3.6.3)。
请注意短语“初始化”和“与非局部对象完全相同”。希望这解释了为什么您不能这样做。
事实上,静态成员更像是通过Myclass::iCount访问的全局对象。因此,您必须在全局范围内(定义类的作用域)初始化它们,就像这样:
class Myclass{

    static int iCount;
} ;
int Myclass::iCount=1;

int main(){
  /*** use Myclass::iCount here ****/
}

相关话题:

静态成员变量如何影响对象大小?


3

这是正确的C++写法。在cpp文件中,函数外部的初始化是在可执行程序开始/启动时完成的(甚至在调用main()函数之前)。

//main.h

class Myclass{

    static int iCount;
}; // and don't forget this ";" after a class declaration


//main.cpp

int Myclass::iCount=1;

int main(){



}

3

由于C++语法不允许这样做。您需要在某个函数的作用域之外实例化静态变量。

此外,您忘记在类结束括号后添加分号;


2

从C++标准(§8.5/10)中:

静态成员的初始化程序在成员类的作用域内。

Myclass具有全局作用域,您尝试在更窄的作用域(函数main的作用域)中初始化其静态成员。


1

静态初始化发生在运行时初始化调用 main 函数之前。

将其放置在函数内部是不允许的,因为那里声明了局部作用域对象。允许这样做会导致混乱和歧义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接