为了账号安全,请及时绑定邮箱和手机立即绑定

什么时候在C ++中通过引用传递和何时通过指针传递?

什么时候在C ++中通过引用传递和何时通过指针传递?

C++
Helenr 2019-10-10 14:25:24
常见情况:将std :: string传递给函数foo(std :: string *)或foo(std :: string&);将tr1 :: shared_ptr传递给函数foo(tr1 :: shared_ptr * ptr)或foo(tr1 :: shared_ptr&ptr);通常,什么是良好实践。我总是很困惑。最初,将所有内容作为引用传递似乎是一致的,但是不可能将Literals作为引用传递或将NULL作为引用传递。同样,将所有内容都用作指针看起来不错,但随后我不得不担心指针可能指向NULL并在该函数的开头检查这些条件。您认为以下代码片段好吗?#include <iostream>#include <vector>#include <map>#include <string>#include <tr1/memory>#include <algorithm>using namespace std;using namespace std::tr1;int main(){        map<string, shared_ptr<vector<string> > > adjacencyMap;        vector<string>* myFriends = new vector<string>();        myFriends->push_back(string("a"));        myFriends->push_back(string("v"));        myFriends->push_back(string("g"));        adjacencyMap["s"] = shared_ptr<vector<string> >(myFriends);        return 0;}谢谢阿杰
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

引用更容易正确。

您使用的文字不是使用const引用吗?您不能将临时(由文字产生)绑定到非常量引用,因为更改一个临时引用是没有意义的。您可以将一个绑定到const引用。

特别是,当将参数传递给函数时,该函数将不会对其进行更改,并且它不是内置类型,请通过const引用传递。它的工作原理与按值传递大致相同,不同之处在于它不需要复制构造函数调用。

指针很有用,因为它们具有可以测试的保证无效值。有时这是无关紧要的,有时这是非常重要的。当然,通常不能通过指针传递文字,除非(在字符串文字的情况下)已经存在。

一些编码标准说,非const引用不应该传递任何内容,因为在调用时它没有提供参数可能由函数更改的指示。在这种情况下,将要求您通过指针传递。我不赞成这样做,特别是因为编程工具使获取函数签名变得越来越容易,因此您可以查看函数是否可以更改参数。但是,在团队或企业中工作时,样式一致性比任何单个样式元素都重要。


查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 702 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信