C++中实参与形参的转换问题?

来源:百度知道 编辑:UC知道 时间:2024/05/10 11:48:45
#include <iostream>
using namespace std;
template <typename T,size_t N>
void array_init(T (&parm)[N])//这里&parm为什么要加个();
{
for(size_t i=0;i!=N;++i)
{
parm[i]=i;
cout<<parm[i];}
}
int main()
{ int x[4];
array_init(x);//这里的x实参与模板函数中的形参匹配吗?不匹配是怎么转换的?
system("pause");
return 0;
}

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中的数组,因为数组的语法确实太不易懂了,而且因为习惯,编译器也