#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.
解决方案 »
- 我看了还是没有看懂,哪位大侠帮指点一下,为什么是那样的输出呢?
- StretchBlt如何能够适应rect大小?
- 如何学习编程?
- 我做了一个 TCP 服务器,现在刚完成基本的 socket 通讯部分,我想找个软件来测试一下它的性能,用什么软件呢?
- 请熟悉网络安全的程序员帮忙画下面这段程序的流程图!!!谢谢!!
- 编译器与VC 之间是什么关系? VC大概有多少种编译器? 越详细越好啊
- 没有windows编程的经验。想学习windows程序设计。在看完c++后,该看什么书?
- 新手求教,为何无法导入位图(即.bmp格式的图片)
- 有那位大哥知道工程A的对话框类,如何放到工程B中使用?
- ? unresolved external symbol __endthreadex __beginthreadex
- 保存编辑框中数据的问题
- 尿沉渣的图像中的管型和上皮细胞的二值化和边缘检测
{
public:
static int i;
};int cl::i=1;
void main()
{
cl c;
return;
}
内存分配方式有三种:
(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
}
这样看来.类外的初始化那一行根本没有起到初始化的作用.它赋的值根本没用.(对私有静态成员变量是这样.公有的还是有作用的)
于是我的理解是:
静态成员变量的定义一共包括两个部分.
像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下.
只是私有的静态成员在类外是不可访问的.于是在类外的赋值语句将不起作用,只起到一个"实现"的作用.
我的理解:私有的静态成员变量在编译 的时候就已经为其分配好内存了,并为其初始化,当用类定义对象的时候,就会调用类的构造函数重新给静态成员变量赋值。