关于类中的static数据成员

ftkghost 2004-10-13 10:38:51
#include<iostream>
#include<cstring>
#include<cstddef>
#include<new>

const int maxnames=5;

class Names{
char name[25];
//注意:类中声明的static数据成员其占用的内存空间另辟,并不算在定义他们的类中
// 例如 sizeof(Names)其值一直为25;
static char pool[]; //这里是类中static变量的定义;
static bool inuse[maxnames];
public:
Names(char* s)
{
std::cout<<"Names constructor"<<std::endl;
strncpy(name,s,sizeof(name));
}
//throw(std::bad_alloc) 当内存不足,分配内存失败时,抛出异常
//std::bad_alloc是一个异常类,报告内存分配失败异常所用的基类。
void* operator new(size_t) throw(std::bad_alloc);
void operator delete(void*) throw();
void display() const
{
std::cout<<"Names::name : "<<name<<std::endl;
}
void dispPool(int ct) const
{
std::cout<<std::endl
<<"pool["<<ct*sizeof(Names)
<<"]~pool["<<(ct+1)*sizeof(Names)-1<<"] : ";
for(int j=0;j<sizeof(Names);j++)
std::cout<<pool[sizeof(Names)*ct+j];
std::cout<<std::endl;
}
};
//Simple memory pool to handle fixed number of Names.
//为什么在此处还要声明pool[]和inuse[]
char Names::pool[maxnames*sizeof(Names)];
bool Names::inuse[maxnames];

//Overloaded new operator for the Names class.
//返回值类型void*,返回一个空闲内存区域的指针;
void* Names::operator new(size_t) throw(std::bad_alloc)
{
std::cout<<"Overloaded operator new"<<std::endl;
for(int p=0;p<maxnames;p++){
if(!inuse[p]){ //若标记区域未分配(即inuse[p]=false)
inuse[p]=true; //则分配此空间
return pool+p*sizeof(Names); //返回此空间的起始指针
}
}
throw std::bad_alloc();
}

//Overloaded delete operator for Names class.
//以void* 作为实参 调用delete时运算符右边给出需要"释放"空间的数组地址。
void Names::operator delete(void* p) throw()
{
std::cout<<"Overloaded operator delete"<<std::endl;
if(p!=NULL)
//delete后此区域空间标志可用(未分配,即inuse[p]=false)
inuse[((char*)p-pool)/sizeof(Names)]=false;
}

int main()
{
Names* nm[maxnames];
int i;
for(i=0;i<maxnames;i++){
std::cout<<"Enter name # "<<i+1<<": ";
char name[25];
std::cin>>name;
nm[i]=new Names(name); //先调用operator new再调用构造函数。
std::cout<<"sizeof(*nm["<<i<<"])="<<sizeof(*nm[i])<<std::endl;
}
for(i=0;i<maxnames;i++){
nm[i]->dispPool(i);
nm[i]->display();
delete nm[i];
}
system("Pause");
return 0;
}

请问:类中定义一个static数据成员,为什么还要在类外声明?而且类中的static数据成员占有空间为什么不算在类中?其占用的空间在哪里?为什么在这个程序中定义一个成员函数但是不能用sizeof(Names::pool)查看其大小?

class A{
....
static char pool[]; //这种形式是什么意思?类似函数形参中的指针!?
....
}

我看例子的时候遇到的一些问题,不解决心里总有一块疙瘩,向后看老想着这事!
请高手解惑啊~~谢谢了
...全文
234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
248406869 2004-10-14
  • 打赏
  • 举报
回复
1、类中定义一个static数据成员,为什么还要在类外声明?
首先给你纠正一个错误,类里面是声明类外面才是定义。只在类里面声明是不行的,因为变量只有在定义时分配存储空间。注意定义不一定要初始化。

2、其占用的空间在哪里?
它的空间肯定不在类的实例中,象全局变量一样在静态存储区中,被每一个类的实例共享。

3、为什么在这个程序中定义一个成员函数但是不能用sizeof(Names::pool)查看其大小?
语法就是这么规定的,所以你不能查看。
sharkhuang 2004-10-14
  • 打赏
  • 举报
回复
c里面有这样的写法 char a【】=“a”;
oldjackyone 2004-10-14
  • 打赏
  • 举报
回复
类中定义一个static数据成员,为什么还要在类外声明?

C++中规定,static数据成员必须在类外部进行初始化,并不是在类外声明。

而且类中的static数据成员占有空间为什么不算在类中?其占用的空间在哪里?

因为static成员与class中的数据成员不在同一个内存段,static存贮在静态存贮区,而class-member(非static成员)则不一定(静态/栈/堆),三种情况都有可能,就看你怎么申请class空间了。

为什么在这个程序中定义一个成员函数但是不能用sizeof(Names::pool)查看其大小?

老大哦,这可是private成员哦,你怎么可以在main里面用sizeof()的?


class A{

....

static char pool[];
//这里是声明,但并没有真正的定义及初始化,只有在类外进行char Names::pool[maxnames*sizeof(Names)];才会真正在静态存贮区分配空间。

....
}
zgy166 2004-10-14
  • 打赏
  • 举报
回复
hcj2002(流浪者·躬自厚而薄责于人) 已经讲得很详细了
isis 2004-10-14
  • 打赏
  • 举报
回复
如果成员是一个类的指针呢
比如
static CMyClass* pointer
那么如何初始化
fire_up 2004-10-13
  • 打赏
  • 举报
回复
楼上说的很对,pool[]的大小需要初始化,不过inuse[]好象就没有必要在类外初始化了吧,类中已经分配好空间了。
hcj2002 2004-10-13
  • 打赏
  • 举报
回复
晕~

又写错了

上面的两句是初始化静态成员,而不是声明
hcj2002 2004-10-13
  • 打赏
  • 举报
回复
static成员存储在数据段中。

static char pool[]; //这种形式是什么意思?类似函数形参中的指针!?
可以定义一个char类型的指针pool

静态成员须在类外初始化

//为什么在此处还要声明pool[]和inuse[]
char Names::pool[maxnames*sizeof(Names)];
bool Names::inuse[maxnames];
上面的两句是初始化静态成员,而声明


64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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