首 页文章中心下载中心繁體中文
设为首页
加入收藏
联系我们
您当前的位置:开源盛世-源代码下载网 -> 文章中心 -> VC++专区 -> 文章内容 退出登录 用户管理
栏目导航
· VC++专区 · V B 专区
· GIS 专区 · PDA 专区
· 其他编程 · 网站开发类
· 数据库类 · 软件应用
· 网络安全 · 论文专区
· 综合资讯
热门文章
· Tab Control控件使用...
· 学生档案管理系统
· [图文] 排列组合公式
· UTF-8与GB2312之间的...
· DirectShow下载安装...
· Virtual PC 在PAE模...
· Windows2000终端服务...
· MapInfo上的GIS系统...
· Mapbasic参考手册索...
· MapX应用开发中文讲...
相关文章
C++中类的静态数据成员函数解析
作者:zieckey  来源:vscodes.com整理  发布时间:2007-1-15 21:14:22  发布人:Polaris

减小字体 增大字体

静态数据成员:
下面看一个例子:
#include <iostream.h>
class  Point
{
public:
 void output()
 {
 }
 static void init()
 {  
 } 
};
void main( void )
{
 Point pt;
 pt.init();
 pt.output(); 
}
这样编译是不会有任何错误的。
下面这样看
#include <iostream.h>
class  Point
{
public:
 void output()
 {  
 }
 static void init()
 {  
 } 
};
void main( void )
{
 Point::output();
}
这样编译会处错,错误信息:illegal call of non-static member function,为什么?
因为在没有实例化一个类的具体对象时,类是没有被分配内存空间的。
好的再看看下面的例子:
#include <iostream.h>
class  Point
{
public:
 void output()
 {  
 }
 static void init()
 {  
 } 
};
void main( void )
{
 Point::init();
}
这时编译就不会有错误,因为在类的定义时,它静态数据和成员函数就有了它的内存区,它不属于类的任何一个具体对象。
好的再看看下面的例子:
#include <iostream.h>
class  Point
{
public:
 void output()
 {  
 }
 static void init()
 { 
  x = 0;
  y = 0;
 }
private:
 int x;
 int y;
};
void main( void )
{
 Point::init();
}
编译出错:
illegal reference to data member 'Point::x' in a static member function
illegal reference to data member 'Point::y' in a static member function
在一个静态成员函数里错误的引用了数据成员,
还是那个问题,静态成员(函数),不属于任何一个具体的对象,那么在类的具体对象声明之前就已经有了内存区,
而现在非静态数据成员还没有分配内存空间,那么这里调用就错误了,就好像没有声明一个变量却提前使用它一样。
也就是说在静态成员函数中不能引用非静态的成员变量。
好的再看看下面的例子:
#include <iostream.h>
class  Point
{
public:
 void output()
 {
  x = 0;
  y = 0;
  init();  
 }
 static void init()
 { 

 }
private:
 int x;
 int y;
};
void main( void )
{
 Point::init();
}
好的,这样就不会有任何错误。这最终还是一个内存模型的问题,
任何变量在内存中有了自己的空间后,在其他地方才能被调用,否则就会出错。
好的再看看下面的例子:
#include <iostream.h>
class  Point
{
public:
 void output()
 { 
 }
 static void init()
 { 
  x = 0;
  y = 0;
 }
private:
 static int x;
 static int y;
};
void main( void )
{
 Point::init();
}
编译:
Linking...
test.obj : error LNK2001: unresolved external symbol "private: static int Point::y" (?y@Point@@0HA)
test.obj : error LNK2001: unresolved external symbol "private: static int Point::x" (?x@Point@@0HA)
Debug/Test.exe : fatal error LNK1120: 2 unresolved externals
执行 link.exe 时出错.
可以看到编译没有错误,连接错误,这又是为什么呢?
这是因为静态的成员变量要进行初始化,可以这样:
#include <iostream.h>
class  Point
{
public:
 void output()
 { 
 }
 static void init()
 { 
  x = 0;
  y = 0;
 }
private:
 static int x;
 static int y;
};
int Point::x = 0;
int Point::y = 0;
void main( void )
{
 Point::init();
}
在静态成员数据变量初始化之后就不会出现编译错误了。
再看看下面的代码:
#include <iostream.h>
class  Point
{
public:
 void output()
 { 
 }
 static void init()
 { 
  x = 0;
  y = 0;
 }
private:
 static int x;
 static int y;
};
void main( void )
{
}
编译没有错误,为什么?
即使他们没有初始化,因为我们没有访问x,y,所以编译不会出错。

End of《C++中类的静态数据成员函数解析》

[] [返回上一页] [打 印] [收 藏]
 
∷相关“C++中类的静态数据成员函数解析”文章评论∷
(评论内容只代表网友观点,与本站立场无关!) [更多评论...]
  评论人:aa   打分:85 分  发表时间:2007-4-1 18:29:23
· 写得不错 ! 
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 网站目录 鄂ICP备06007162
开源盛世 版权所有Copyright © 2003-2005 VSCodes.Com. All Rights Reserved.