有关模板函数的问题

laohanaa888 2011-11-10 08:45:56
最近读C++ Primer时遇到了一些问题,希望哪位好心的大侠帮忙解决下

如下:
template <class Type, int size>
Type min( Type (&r_array)[size] ) { /* ... */ }

void f( int pval[3] ) {
// 错误: Type (&)[] != int*
int jval = min( pval );
}

int main()
{
int arr[] = {1,2,3};
min(arr);
}

问题:
上面的问题是因为pval是个指针而非引用导致的,但是我在main函数中通过定义一个数组,然后通过数组名调用,min(arr),这样的话不会有问题。
1、执行min(arr);中,传递的是数组的引用? 那么我们平时在调用数组名时都是通过将其转换成指针使用的吗?但是如果遇到上述情况,也就是min( Type (&r_array)[size] ) 才会将数组作为引用传递吗?
2、调用f()函数时,数组pval是如何被初始化来接受arr的呢,正如我上面说的,数组在传递时一般是通过指针来传递的,所以pval被当做指针而非数组引用吗?

问题核心:
数组一般在传递和使用时是被当做指针来使用,而当遇到作为引用min( Type (&r_array)[size] ) 参数传递时才会被当做引用?
...全文
140 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
laohanaa888 2011-11-17
  • 打赏
  • 举报
回复
今天看primer 第四版,其中有这么一句话:
“如果形参是数组的引用,
编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,
数组大小成为形参和实参类型的一部分。 编译器检查数组的实参的大小与形参的
大小是否匹配”

我的问题也就解决了,解释如下:
min(arr); 这里传递的是引用,因为Type (&r_array)[size]是通过引用声明的;
void f( int pval[3] ) 这里传递的是指针,因为如果参数不是数组的引用,默认的是用指针传递

╮(╯▽╰)╭,搞个原理,咋就这么难呢?????看来基础很重要啊.......

asmilemyself 2011-11-11
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

void funin(int (&arr)[5][5])//形参为引用
{
for(int i = 0;i != 5;i++)
for(int j = 0;j != 5;j++)
arr[i][j] = i*j;
}
void funout(const int (&arr)[5][5])//形参为引用
{
for(int i = 0;i != 5;i++)
for(int j = 0;j != 5;j++)
cout << arr[i][j] << " ";
}
void funin1(int (*arr)[5],int row)//形参为指针
{
for(int i = 0; i != row;i++)
for(int j = 0;j != 5;j++)
arr[i][j] = i*j;
}
void funout1(int (*arr)[5],int row)//形参为指针
{
for(int i = 0; i != row;i++)
for(int j = 0;j != 5;j++)
cout << arr[i][j] << " ";
}
void funin2(int arr[5][5])//形参既不为引用也不为指针,这里很猫腻,这种情况和指针一样
{
for(int i = 0;i != 5;i++)
for(int j = 0;j != 5;j++)
arr[i][j] = i*j;
}
void funout2(const int arr[5][5])
{
for(int i = 0;i != 5;i++)
for(int j = 0;j != 5;j++)
cout << arr[i][j] << " ";
}
int main()
{
int iarray[5][5];
int iarray1[5][5];
int iarray2[5][5];
funin(iarray);//传递指针
funout(iarray);
cout << endl;
funin1(iarray1,5);//传递指针
funout1(iarray1,5);
cout << endl;
funin2(iarray2);//传递指针
funout2(iarray2);
return 0;
}

一点理解,希望有用
iamnobody 2011-11-10
  • 打赏
  • 举报
回复
百度一下:左右法则。大概就会知道了。。
(&P)//这个括号先运算,于是p就被第一时间解释为引用。
类似的
(*P)//p必然是指针,无论()的左边和右边有什么类型。

void (*p)(int );//函数指针。
xingfeng2510 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq120848369 的回复:]

C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

template <class Type, int size>
Type min( Type (&r_array)[size] ) { return (Type)0; }

void f( int (&pval)[3] ) {……
[/Quote]
楼上正解
把两个函数中的形参类型均表示为数组的引用类型就行了 int (&arr)[3];
laohanaa888 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]
void f( int pval[3] ) { 退化为int *了。
[/Quote]

那请问下我上面自己的理解全部都对吗?
void f( int (&pval)[3] ) 在pvvl前面加&我也试过是没有问题的,但是我不知道原理是什么?希望能够给小弟解答一下!!!!!
qq120848369 2011-11-10
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

template <class Type, int size>
Type min( Type (&r_array)[size] ) { return (Type)0; }

void f( int (&pval)[3] ) {
int jval = min( pval );
}

int main()
{
int arr[] = {1,2,3};
min(arr);
f(arr);
return 0;
}
qq120848369 2011-11-10
  • 打赏
  • 举报
回复
void f( int pval[3] ) { 退化为int *了。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧