From: http://hi.baidu.com/idealsoft/blog/item/609a6509552753216b60fbb4.html
前一篇,我已经对大家粗浅的解释了CArray的用法,现在,再详细的给大家说说CArray的参数问题。
数组---这个C语言中的怪物,自从被直接继承到C++中,无数有识之士们前赴后继、绞尽脑汁的试图寻找一种可以动态增长的替代数据类型。当然,最著名的,应该就是vector向量。但是,它也还是浑身绿毛,迭代的出现,几乎彻底的摧毁了它仅存的一点优点。所以,引入MFC之后,微软斩钉截铁的抛弃了标准C++的模板库。
CArray是MFC中非常重要的几个类模板之一,其他还有CList、CMap,他们的定义略微有点晦涩,CArray声明如下:
template<class TYPE, class ARG_TYPE>
class CArray : public CObject
从中,我们可以看出来,CArray是继承自CObject,应该属于MFC的体系,看这2个参数:
TYPE:这是一个用来返回的类型,一般来说,它应该和ARG_TYPE一致,但不绝对。
ARG_TYPE:相对于TYPE,它是用来传入的,ARG,我想应该是argument(参数)的意思。
如何来理解这两个参数呢?
举个简单的例子吧,定义一个以CString为元素的动态数组:
tpyedef CArray<CString, CString&> CArrStr;
现在,我们构造了一个以CString为元素的动态数组,你可以用Add函数来添加一个函数,也可以用GetAt函数来获得一个元素。这刚好是两个几乎相反的操作,Add函数的原型是:
int Add(ARG_TYPE newElement);
我们用CString&替换ARG_TYPE之后,就可以得到如下的实现:
int Add(CString& newelement);
原来是这样啊,完全符合我们的日常习惯。再来看看GetAt函数的原型:
TYPE GetAt(int nIndex) const;
同样,我们替换TYPE之后,得到的是:
CString GetAt(int nIndex) const;
很简单,非常容易理解。如果你有兴趣去查看CArray的源码的话,你会发现所有的入参—也就是向CArray提供的参数,都是ARG_TPYE,而所有的由CArray返回的类型都是TYPE,那么我们现在,应该非常清楚CArray参数使用方法了,它同样适合于其他的类模板。
别走开,下面,我们将讨论CArray的效率问题。