#include <malloc.h>
#include <memory.h>
class Blanks
{
public:
void * operator new(size_t t,char chInit);
};
void * Blanks::operator new(size_t t, char chInit){
void *temp=malloc(t);
if (temp!=0)
{
memset(temp,chInit,t);
}
return temp;
}
int main(int argc, _TCHAR* argv[])
{
Blanks *a5=new(0xa5)Blanks; //创建对象Blanks,并且初始化为0xa5
return a5!=0;
}
主函数的new是类中new操作符重载。
但是new后面只有一个参数oxa5,而类中函数的声明是void *operator new (size_t stAllocateBlock, char chInit) ;
两个参数,怎么会调用这个类的呢?
分析:
1. 重载new操作符第1个参数必须是size_t类型的,并且传入的值就是类的大小。本例题中类的大小为1。
如果类中含有一个int类型成员(int占4个字节),那么参数stAllocateBlock的值为4。
2. Blanks *a5 = new( 0xa5 ) Blanks;
分别表示:
0xa5就是参数char chInit ,size_t stAllocateBlock就是类的大小。
memset(temp,chInit,t);
oxa5表示第二个参数的大小,也就是chInit为oxa5,用0xa5初始化分配的那块内存。
Blanks *a5 = new( 0xa5 ) Blanks;
这个表达式动作如下:
A.调用Blanks重载的new操作符函数
B.调用默认的构造函数初始化对象
C.用Blanks对象地址初始化a5