请教: 类的静态成员变量赋值的问题

ifare 2013-04-15 12:48:58

#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.



...全文
1439 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ifare 2013-04-16
  • 打赏
  • 举报
回复
谢谢, 英文的也好啊 有一个标准手册, 心理有底一点
一个傻冒 2013-04-16
  • 打赏
  • 举报
回复
有C++标准文档。页数不少。全英文
ifare 2013-04-16
  • 打赏
  • 举报
回复
规则是可以接受的解释 不知道在哪本权威的书上可以看到所有c++的规则 我现在参考的一本书算比较全面但有明显的错误(就是上面提问的程序), 而且深度不够
一个傻冒 2013-04-15
  • 打赏
  • 举报
回复
#include<iostream> class cl { public: static int i; }; int cl::i=1; void main() { cl c; return; }
打你屁屁 2013-04-15
  • 打赏
  • 举报
回复
C++ Primer有提到,static成员变量只能在类外初始化,不能在构造函数中初始化
shen_wei 2013-04-15
  • 打赏
  • 举报
回复
2楼的比较详细。。。
jimette 2013-04-15
  • 打赏
  • 举报
回复
规则啊!!!
ifare 2013-04-15
  • 打赏
  • 举报
回复
谢谢楼上两位, 还是有点不明白, 是在类外初始化 但为什么初始化时, 还要重复定义一下
青松2 2013-04-15
  • 打赏
  • 举报
回复 1
类的静态成员变量 内存分配方式有三种:       (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 } 这样看来.类外的初始化那一行根本没有起到初始化的作用.它赋的值根本没用.(对私有静态成员变量是这样.公有的还是有作用的) 于是我的理解是: 静态成员变量的定义一共包括两个部分. 像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下. 只是私有的静态成员在类外是不可访问的.于是在类外的赋值语句将不起作用,只起到一个"实现"的作用.     我的理解:私有的静态成员变量在编译 的时候就已经为其分配好内存了,并为其初始化,当用类定义对象的时候,就会调用类的构造函数重新给静态成员变量赋值。  

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧