在C++中是否应该使用指针,何时使用指针

来源:互联网 发布:淘宝u站9.9包邮 编辑:程序博客网 时间:2024/09/21 08:17

http://bbs.csdn.net/topics/340133178


C++中,除了多态情形外,最好避免指针(个人建议),下面是各种情形的替代方式,简单又高效:
1、指针作为函数形参,用引用&代替
比如某个类的拷贝函数 bool classA_copy(classA *s1, const classA *s2);
        可写作   bool classA_copy(classA &s1, const classA &s2);
这样在函数实现时书写更方便(反正我不习惯“->”)。
2、指针动态申请单个对象,用auto_ptr代替
常规的方式:classA *p;   p = new classA(); ..... delete p;
要记住一定要写delete,不然会内存泄漏,如果这个指针p要反复申请新的变量,那么在申请之前也一定要delete一次。那么,程序可能要修改成这样:
         classA *p=NULL; //一定要初始化
         if(p)   delete p;  p = new classA(); //申请之前要检测是否需要释放
         if(p)   delete p; //在程序结束时,还要判断是否释放内存。
这样就有点让人写的不爽了,其实,用auto_ptr更简单:
auto_ptr<classA> p; //变量声明
p.reset(new classA()); //申请新的classA变量,会自动释放旧的classA变量(如果有的话)
//在函数结束时,auto_ptr会自动释放内存。
3、指针动态申请一维数组,用vector代替
指针用于申请单个变量已经比较麻烦了,申请多个变量时更麻烦,相信大家都有同感。
上面的auto_ptr方式只能用于申请单个变量,如果多个变量,就用vector代替吧。
关于vector的用法请查询相关C++教程。
4、指针动态申请多维数组,用boost::MultiArray代替
boost是C++的准标准库,里边实现了相当多的精巧技术,值得一看。MultiArray实现的是多维数组的功能。
当然,用vector<vector<classA>>来实现也是可以的,稍稍麻烦点而已。
5、函数指针,用boost::function代替
使用函数指针一般用来推迟一个调用或做一个回调。boost::function可以代替函数指针,允许用户在目标的实现上拥有更大的弹性。
如果需要多个回调,需考虑boost::signals,它提供了更强大的可控功能。
6、指针容器,用boost::pointer_container 
熟悉stl标准算法的人都知道,vector、list、map等标准容器的元素都是深拷贝的。当元素复制的代价较大时,就应该考虑指针容器;此外,某些类是没有复制函数的(比如MFC的CSocket类),想用容器来管理多个元素,也应该使用指针容器。
指针容器,就是指容器中保存的是指向元素的指针。当然,也可以用vector<(classA *>来实现,但是要记住及时的删除内存,类似情形2。
boost::pointer_container实现了指针容器的功能,和stl容器的用法十分相似,还能够自动管理内存。



0 0