LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 834|回复: 2

几个C++ PRIMER上的函数模板问题。

[复制链接]
发表于 2003-9-3 22:43:36 | 显示全部楼层 |阅读模式
1>
typedef    int   (& rai)[10];
template   <class T >
T min ( T ( &arr)[10] );

int array[10]={0};

min ( array );

问题:a> 第一个typedef是声明 rai 为有十个 int 型元素的数组的引用吗?为什么是这样声明呢?总是习惯  typedef int I  ;  之种形式的。
      b> 模板函数的参数为数组的引用,实参应该给个数组吧?而我们传给它的是数组名,一个指针,如何解释呢?照我理解直接传个 array[10]  为何不可呢?
      c> 顺便问一下,一个普通函数以数组的引用为开参,如何专给它实参呢?具体作何理解或解释?


2>
C++ PRIMER
P418。

template   <class T1,  class T2,  class  T3>
   T1  sum ( T2,  T3);

typedef    unsigned  int  ui_type;

P419:

ui_type  (*pf)  (char  ,  ui_type) =  & sum < ui_type >;

问题:
为什么我不可能直接用:ui_type  (*pf)  (char  ,  ui_type) =  & sum  ;
呢?因为我认为 (*pf)前面的 ui_type 说明了这个指针指向的函数的返回类型,所以编译器可以根据这个来推演出模板参数  T1 ,然后生成实例。
而不用 &sum  <ui_type>  用<ui_type>来显示模板参数化来指明 T1。不是吗?


3>
P412:

template  <teypename  Type,  int size>
  Type  min (Type ( &r_array) [size]
{      }
int   ia[ ] = { 10, 7 , 8, 9, 4 };
......................
#include <iostream>
int   main ()
{
    ..............
   int i = min ( ia );
    ..............
}

P414:

template  <class Type,  int size >
Type  min (Type  ( &r_array)[size] )
{   }
void f (int pval[9] )
{
    // 错误: Type (&)[ ] != int *
    int  jval = min ( pval );
}

问题:
      这两个例子不是一样的吗?为什么一个错误一个没有?
为什么它说 pval 是 int * 型,而不是 int 型数组类型。那 p412 的那个例子为什么不是一样的吗?怎么解释?
发表于 2003-9-3 23:56:26 | 显示全部楼层

回复: 几个C++ PRIMER上的函数模板问题。

我也刚开始看,谈谈我的理解:
最初由 Andy84920 发表
1>
typedef    int   (& rai)[10];
template   <class T >
T min ( T ( &arr)[10] );

int array[10]={0};

min ( array );

问题:a> 第一个typedef是声明 rai 为有十个 int 型元素的数组的引用吗?为什么是这样声明呢?总是习惯  typedef int I  ;  之种形式的。
      b> 模板函数的参数为数组的引用,实参应该给个数组吧?而我们传给它的是数组名,一个指针,如何解释呢?照我理解直接传个 array[10]  为何不可呢?
      c> 顺便问一下,一个普通函数以数组的引用为开参,如何专给它实参呢?具体作何理解或解释?

a> rai 不是数组的引用,是用户自定义数据类型标识符,用它可以定义一个数组的引用,使用方法就和内置的数据类型一样。
如 rai arrayRef 等同于 int (&arrayRef)[10]
typedef int I 只是其中一种最简单的用法。
b> template <class T> T min ( T ( &arr)[10]);
定义了一个模板函数 min() ,它接受一个 T 类型的数组,返回类型也为 T, T 在实际函数调用时替换,这是编译器的工作,这里显然为了减少参数复制的开销,使用了数组的引用,所以加上 &;
在发生函数调用时,我们给它传递了事先定义的数组 array,由于 array 为 int 型,所以 T 被替换为 int,arr 为数组 array 的引用,它就好比 array 的别名,它们是同一个实体,对 arr 的操作就等同于 对数组 array 的操作,从而避免了参数复制的开销;而且很多时候,我们为了从被调用函数返回结果,常采用这种传引用或传递指针的方式。
如果当时定义为 template <class T> T min ( T arr[10]); 那么 arr 就是 array 的一份拷贝,是两个独立的实体。
“。。。直接传个 array[10]。。。”在本例中不对,它相当于传递了数组中第 11 个元素的值(定义数组只有10个元素,越界了)。
这里为什么讲的这里委婉呢?原因是你没有写出 min () 的定义,实际中肯定要看 min() 具体是如何实现的,有时候需要传递数组(名),即你说的传个引用或指针甚至采用传值的方式,有的时候可能需要的就是其中某个元素值或元素地址,具体情况具体分析了。
发表于 2003-9-4 10:47:30 | 显示全部楼层
kao,quanli老大,怎么不上irc?
我们还以为你去度婚假了:-D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表