<b>C++指针利用办法解惑</b>[VC/C++编程]
本文“<b>C++指针利用办法解惑</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在下列函数声明中,为什么要同时利用*和&标记?以及什么场所利用这种声明方法?
void func1( MYCLASS *&pBuildingElement );
论坛中常常有人问到这样的问题.本文试图通过一些实际的指针利用经验来注释这个问题.
细心看一下这种声明方法,确切有点让人迷惑.在某种意义上,"*"和"&"是意思相对的两个东西,把它们放在一同有什么意义呢?.为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念.我们都知道MYCLASS*的意思:指向某个对象的指针,此对象的范例为MYCLASS.
void func1(MYCLASS *pMyClass);
// 比方:
MYCLASS* p = new MYCLASS;
func1(p);
上面这段代码的这种处理办法想必谁都用过,成立一个MYCLASS对象,然后将它传入func1函数.目前假定此函数要改正pMyClass:
void func1(MYCLASS *pMyClass)
{
DoSomething(pMyClass);
pMyClass = // 别的对象的指针
}
第二条语句在函数历程中只改正了pMyClass的值.并没有改正调用者的变量p的值.假如p指向某个位于地址0x008a00的对象,当func1返回时,它仍旧指向这个特定的对象.(除非func1有bug将堆弄乱了,完好有这种大概.)
目前假定你想要在func1中改正p的值.这是你的权利.调用者传入一个指针,然后函数给这个指针赋值.以往普通都是传双指针,即指针的指针,比方,CMyClass**.
MYCLASS* p = NULL;
func1(&p);
void func1(MYCLASS** pMyClass);
{
*pMyClass = new MYCLASS;
……
}
调用func1之后,p指向新的对象.在COM编程中,你处处城市碰到这样的用法--比方在查询对象接口的QueryInterface函数中:
interface ISomeInterface {
HRESULT QueryInterface(IID &iid, void** ppvObj);
……
};
LPSOMEINTERFACE p=NULL;
pOb->QueryInterface(IID_SOMEINTERFACE, &p);
此处,p是SOMEINTERFACE范例的指针,所以&p就是指针的指针,在QueryInterface返回的时刻,假如调用成功,则变量p包含一个指向新的接口的指针.
假如你理解指针的指针,那么你必定就理解指针引用,因为它们美满是一回事.假如你象下面这样声明函数:
void func1(MYCLASS *&pMyClass);
{
pMyClass = new MYCLASS;
……
}
其实,它和前面所讲得指针的指针例子是一码事,只是语法有所差别.传送的时刻不用传p的地址&p,而是直接传p本身:
MYCLASS* p = NULL;
func1(p);
在调用之后,p指向一个新的对象.普通来说,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量.所以只要你碰到*&,就应当想到**.也就是说这个函数改正或大概改正调用者的指针,而调用者象普通变量一样传送这个指针,不利用地址操作符&.
至于说什么场所要利用这种办法,我会说,极少.MFC在其调集类顶用到了它--比方,CObList,它是一个CObjects指针列表.
class CObList : public CObject {
……
// 获得/改正指定位置的元素
CObject*& GetAt(POSITION position);
CObject* GetAt(POSITION position) const;
};
这里有两个GetAt函数,功效都是获得给定位置的元素.辨别安在呢?
辨别在于一个让你改正列表中的对象,另一个则不行.所以假如你写成下面这样:
CObject* pObj = mylist.GetAt(pos);
则pObj是列表中某个对象的指针,假如接着改变pObj的值:pObj = pSomeOtherObj;
这并改变不了在位置pos处的对象地址,而仅仅是改变了变量pObj.但是,假如你写成下面这样:CObject*& rpObj = mylist.GetAt(pos);
目前,rpObj是引用一个列表中的对象的指针,所以当改变rpObj时,也会改变列表中位置pos处的对象地址--换句话说,替换了这个对象.这就是为什么CObList会有两个GetAt函数的来由.一个可以改正指针的值,另一个则不能.注意我在此说的是指针,不是对象本身.这两个函数都可以改正对象,但只有*&版本可以替换对象.
在C/C++中引用是很重要的,同时也是高效的处理手段.所以要想成为C/C++高手,对引用的概念没有透彻的理解和纯熟的利用是不行的.
以上是“<b>C++指针利用办法解惑</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |