几道笔试题把小弟我搞郁闷了。

几道笔试题把我搞郁闷了。。
1.  
What   is   displayed   when   f()   is   called   given   the   code:
class   Number   {
public:
    string   type;
    Number():   type(“void”)   {   }
    explicit   Number(short)   :   type(“short”)   {   }  
    Number(int)   :   type(“int”)   {   }
};
void   Show(const   Number&   n)   {   cout   < <   n.type;   }
void   f()
{
short   s   =   42;
Show(s);  
}
a)   void
b)   short
c)   int
d)   None   of   the   above

2.   Which   is   the   correct   output   for   the   following   code
double     dArray[2]   =   {4,   8},   *p,   *q;
p   =     &dArray[0];
q   =   p   +   1;
cout   < <   q   –   p   < <   endl;  
cout   < <   (int)q   -   (int)p   < <   endl;
a)   1   and   8
b)   8   and   4
c)   4   and   8
d)   8   and   1
大家帮忙看看,不只要答案,最好还能说明为什么。。给我这个新手讲解一下。。。

------解决方案--------------------
第一个选C;
虽然传入的是short类型,但是short类型的构造函数被生命被explicit,也就是只能显示类型转换,不能使用隐式类型转换。
第二个选A;
第一个是指针加减,按照的是指向地址类型的加减,只跟类型位置有关,q和p指向的数据类型以实际数据类型来算差一个位置,因此是1。而第二个加减是实际指针值得加减,在内存中一个double类型占据8个字节,因此是8