关于c++中函数实参与形参的匹配问题

#include<iostream>
using namespace std;

void compare(const int (&a)[5],const int (&b)[5])
{cout<<"1"<<endl;}
void compare(int (&a)[5],int (&b)[5])
{cout<<"5"<<endl;}
void compare(const int *&p,const int *&q)
{cout<<"3"<<endl;}
void compare(const int *p,const int *q)
{cout<<"2"<<endl;}
void compare(int *p,int *q)
{cout<<"4"<<endl;}
void compare(int *&p,int *&q)
{cout<<"6"<<endl;}

void main()
{
int *p=0,*q=0;
const int *const_p=0,*const_q=0;
int arry1[]={1,2,3,4,5},arry2[]={2,3,4,5,6};
const int const_arry1[]={1,2,3,4,5},const_arry2[]={2,3,4,5,6};
compare(arry1,arry2);
compare(const_arry1,const_arry2);
compare(p,q);
compare(const_p,const_q);
}
在main函数中几个compare函数分别调用上面哪个函数,若某个compare函数在调用时有歧义,请写出那几个函数有歧义,为什么,最重要是为什么????
不要没看清问题内容,只看题目,复制别的问题的回答贴在这里了行不

template <typename T,size_t N>
void array_init(T (&parm)[N])
函数的形参是指向数组的引用,这里定义了一个函数模板,是为数组而准备的.首先要认识 int (&A)[10] 这样写法的意义,是对一个10元素数组的引用.

array_init(x);
把数组名作为实参传递给函数。

------------------------
template<class T,size_t N>
void array_init(T (&parm)[N])
{}
这里定义了一个函数模板,是为数组而准备的.首先要认识 int (&A)[10] 这样写法的意义,是对一个10元素数组的引用.
int A[10];
array_init(A);//相当于调用函数:array_init(int (&A)[10])
其次当你这么写程序的时候:
int B[10][20];
array_init(B); //这里发生了什么?
C++语法是很令人头痛的, 我们看 B 是什么类型? 一个[10][20]二维数组,那么模板对应的函数 :
typedef int (TYPE2B)[20] ; //加个typedef , 可能易看一点吧
void array_init(TYPE2B ( &A)[10] )
{
//这时里面的写法是个问题,很难检测出调用错误.
//但是这是可以通过编译的.多维数组与此类推
}

所以当你使用这类模板的时候,请慎重. 也是不少人建议在C++中用vector取代C中的数组,因为数组的语法确实太不易懂了,而且因为习惯,编译器也不能把数组与指针完全区分.

template<class T,size_t N>
void array_init(T (&parm)[N])
{
#ifdef _DEBUG
//检测出这个T不是数组可以检测 typeid(T).name() 里面没有 [] 数组符号
if(strstr(typeid(T).name(),"[") > 0 ) //这是运行期检测,如何在编译期检测?
throw "exception in template array_init";
#endif
....
}

//另外注意一下:
int A[10] ;
int B[10] ;
B = A ; //这里发生了什么? 相当于 for(int i = 0 ; i < 10 ; ++i) B[i] = A[i] ; 吗?
void initA(int param[10]) {}
initA(A) ; //这里是怎么回事?//这时会发生传值调用吗?
void initB(int (¶m)[10]) {}
initB(A) ; //这里与initA对比一下

C中数组与指针,没有完全区分开来,C++继承了这个问题.使用数组时,就会有一些看起来怪怪的写法,如果用vector这些问题也就不存在了.
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-11-26
template <typename T,size_t N>
void array_init(T (&parm)[N])
函数的形参是指向数组的引用,这里定义了一个函数模板,是为数组而准备的.首先要认识 int (&A)[10] 这样写法的意义,是对一个10元素数组的引用.

array_init(x);
把数组名作为实参传递给函数。

------------------------
template<class T,size_t N>
void array_init(T (&parm)[N])
{}
这里定义了一个函数模板,是为数组而准备的.首先要认识 int (&A)[10] 这样写法的意义,是对一个10元素数组的引用.
int A[10];
array_init(A);//相当于调用函数:array_init(int (&A)[10])
其次当你这么写程序的时候:
int B[10][20];
array_init(B); //这里发生了什么?
C++语法是很令人头痛的, 我们看 B 是什么类型? 一个[10][20]二维数组,那么模板对应的函数 :
typedef int (TYPE2B)[20] ; //加个typedef , 可能易看一点吧
void array_init(TYPE2B ( &A)[10] )
{
//这时里面的写法是个问题,很难检测出调用错误.
//但是这是可以通过编译的.多维数组与此类推
}

所以当你使用这类模板的时候,请慎重. 也是不少人建议在C++中用vector取代C中的数组,因为数组的语法确实太不易懂了,而且因为习惯,编译器也不能把数组与指针完全区分.

template<class T,size_t N>
void array_init(T (&parm)[N])
{
#ifdef _DEBUG
//检测出这个T不是数组可以检测 typeid(T).name() 里面没有 [] 数组符号
if(strstr(typeid(T).name(),"[") > 0 ) //这是运行期检测,如何在编译期检测?
throw "exception in template array_init";
#endif
....
}

//另外注意一下:
int A[10] ;
int B[10] ;
B = A ; //这里发生了什么? 相当于 for(int i = 0 ; i < 10 ; ++i) B[i] = A[i] ; 吗?
void initA(int param[10]) {}
initA(A) ; //这里是怎么回事?//这时会发生传值调用吗?
void initB(int (¶m)[10]) {}
initB(A) ; //这里与initA对比一下

C中数组与指针,没有完全区分开来,C++继承了这个问题.使用数组时,就会有一些看起来怪怪的写法,如果用vector这些问题也就不存在了.本回答被网友采纳
第2个回答  2010-11-25
C++中,多态函数调用的时候匹配顺序是:
1.先匹配多态函数(普通函数),再匹配通用函数(模板函数)
2.先匹配不用进行参数类型转换的函数,再匹配需要类型转换的函数
3.先匹配需同类型(如int,long,short,char等是同类型,float,double是一类)转换函数,再匹配不同类型参数转换的函数(int到float等)

书上讲的,是这样.但是,你的程序中,调用会出现歧义,我的编译器编译会报错,通过不了.无法运行看结果.本回答被提问者采纳
相似回答