随笔 - 488, 文章 - 0, 评论 - 921, 引用 - 0
数据加载中……

面试题目(关于new的)

#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.


  

posted on 2006-06-03 21:25 AlanTop 阅读(918) 评论(5)  编辑 收藏 引用 所属分类: 常见面试题目

评论

# re: 面试题目(关于new的)  回复  更多评论   

非常不解:

1. 此题目到底是考察应聘者哪一方面?
2. 此代码在主流编译器上有两个警告,其中C4291 非常严重.
3. 出题人如果是想考察应聘者对C++规范掌握是否全面的话,自己不应该无视新的规范.

# re: 面试题目(关于new的)  回复  更多评论   


Blanks *a5 = new( 0xa5 ) Blanks;


这个能编译通过么?


不解.很不解
2006-06-03 23:47 | erran

# re: 面试题目(关于new的)  回复  更多评论   

这个是c++标准实现的。
可以通过。
看你包含相关的头文件否!
2006-06-04 00:15 | AlanTop

# re: 面试题目(关于new的)  回复  更多评论   

我用vc6试了,不像作者说的那样
“2. Blanks *a5 = new( 0xa5 ) Blanks;分别表示
  0xa5就是参数char chInit 。
  size_t stAllocateBlock就是类的大小。

我跟踪了一下,发现调用Blanks的new函数时,参数stAllocateBlock的值是1,
所以 stAllocateBlock 根本不是类的大小
2007-08-07 12:50 | Leeman

# re: 面试题目(关于new的)[未登录]  回复  更多评论   

类的大小是1啊。你以为呢?这个是编译器隐式插入的,编译器当然知道类的大小。
@Leeman
2009-06-30 15:24 | david

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理