#include<iostream> class cl
{
public:
   static int i;
};
void main() 
{
   cl::i=1;  
   return;  
}以上程序编译时出现错误提示:_debug.obj : error LNK2001: unresolved external symbol "public: static int cl::i" (?i@cl@@2HA)
Debug/c_debug.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

解决方案 »

  1.   

    #include<iostream> class cl
    {
    public:
       static int i;
    };int cl::i=1; 
    void main() 
    {
       cl c;
       return;  
    }
      

  2.   

    类的静态成员变量 
    内存分配方式有三种:   
       
     (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   
       
     (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   
       
     (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。  
    类的静态成员变量和函数中的静态变量一样,在编译的时候就分配内存了,直到程序退出才释放,并不是随着对象的删除而释放的:
     
     
     
    因为类的静态成员变量是所有实例共用的.所以得在类外初始化.
    调用的时候可以通过对象调用,也可以通过类直接调用
    class A
    {
    public:
        int i;    //有默认值
    };
    class B
    {
    public:
        static int n;
        static A Aobj;
    };int B::n = 1;    //静态成员变量的初始化
    A B::Aobj;       //静态成员变量的初始化(实例化)void main()
    {
        B Bobj;
        printf("B::n=%d Bobj.n=%d Bobj.Aobj.i=%d/n", B::n, Bobj.n, Bobj.Aobj.i);
    }
    私有的静态成员变量也是放在类外初始化的.这看起来跟它的私有属性不相符.
    再做下面的测试,发现了一个有趣的现象.
     
    class B
    {
        static int i;
    public:
        B(){i=3;};    //把这行注释掉,输出变成0
        int p(){return i;};
    };int B::i = 2;      //把这行注释掉,编译报错void main()
    {
        B Bobj;
        printf("private: static int B::i=%d/n", Bobj.p());    //输出3
    }
    这样看来.类外的初始化那一行根本没有起到初始化的作用.它赋的值根本没用.(对私有静态成员变量是这样.公有的还是有作用的)
    于是我的理解是:
    静态成员变量的定义一共包括两个部分.
    像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下.
    只是私有的静态成员在类外是不可访问的.于是在类外的赋值语句将不起作用,只起到一个"实现"的作用.
     
     
    我的理解:私有的静态成员变量在编译 的时候就已经为其分配好内存了,并为其初始化,当用类定义对象的时候,就会调用类的构造函数重新给静态成员变量赋值。
     
      

  3.   

    C++ Primer有提到,static成员变量只能在类外初始化,不能在构造函数中初始化