#include <malloc.h>
#include <memory.h>
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
int main()
{
Blanks *a5 = new( 0xa5 ) Blanks;
return a5 != 0;
}
主函数的new是类中new操作符重载。
但是new后面只有一个参数0xa5,
而类中函数的声明是void *operator new( size_t stAllocateBlock, char chInit );两个参数。
怎么会调用这个类内的呢?
这是一个典型的定位new;
上面各个疑点,解释如下:
1. 重载new操作符第一个参数必须是size_t类型的。
void operator new(size_t)
void operator new(size_t , Blanks*)
2. Blanks *a5 = new( 0xa5 ) Blanks;分别表示
0xa5就是参数char chInit 。
size_t stAllocateBlock就是类的大小。
3. 然后,用0xa5初始化分配的那块内存。
Blanks *a5 = new( 0xa5 ) Blanks;
这个表达式动作如下:
A.调用Blanks的操作符 new(size_t, Blanks*)
B.调用默认的构造函数初始化对象
C.用Blanks对象地址初始化a5.