6.52:已知有如下声明,
void manip(int , int);
double dobj ;
请指出下列调用中每个类型转换的等级(参见6.6.1节,第219页)。
(a)manip( ' a ' , ' z '); (b)manip(55.4 , dobj)
Ans:a)实参是char类型,而函数形参是int类型,所以类型转换的等级是类型提升实现的匹配。
b)实参是两个double类型的值,函数形参是int类型,所以类型转换的等级是算术类型转换实现的匹配。
6.53:说明下列每组声明中的第二条语句会产生什么影响,并指出哪些不合法(如果有的话)。
(a)int calc (int & ,int &);
int calc (const int & ,const int &);
(b)int calc(char * ,char *);
int calc(const char * ,const char *);
(c)int calc(char *, char*);
int calc(char *const,char *const);
Ans:a)第二条语句会与第一条语句构成重载函数,若实参是常量,则其会调用第二条语句,因为若形参是常量指针或者引用,那么取决于实参是否是常量而选择调用哪个函数,况且实参传递到形参的对象,会忽略掉顶层const。
b)第二条语句会与第一条语句构成重载函数,与(a)一样。
c)声明不合法。重复声明了,两条语句不能构成重载函数,实参传递到形参的对象,会忽略掉顶层const,实际上两个函数声明其实一样,在调用时会进行精确匹配:向实参添加顶层const或者删掉顶层const都属于精确匹配。