关于类中的static数据成员
#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[]; //这种形式是什么意思?类似函数形参中的指针!?
....
}
我看例子的时候遇到的一些问题,不解决心里总有一块疙瘩,向后看老想着这事!
请高手解惑啊~~谢谢了