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

常见情况:


将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;

}

谢谢阿杰


Helenr
浏览 725回答 3
3回答

慕村225694

引用更容易正确。您使用的文字不是使用const引用吗?您不能将临时(由文字产生)绑定到非常量引用,因为更改一个临时引用是没有意义的。您可以将一个绑定到const引用。特别是,当将参数传递给函数时,该函数将不会对其进行更改,并且它不是内置类型,请通过const引用传递。它的工作原理与按值传递大致相同,不同之处在于它不需要复制构造函数调用。指针很有用,因为它们具有可以测试的保证无效值。有时这是无关紧要的,有时这是非常重要的。当然,通常不能通过指针传递文字,除非(在字符串文字的情况下)已经存在。一些编码标准说,非const引用不应该传递任何内容,因为在调用时它没有提供参数可能由函数更改的指示。在这种情况下,将要求您通过指针传递。我不赞成这样做,特别是因为编程工具使获取函数签名变得越来越容易,因此您可以查看函数是否可以更改参数。但是,在团队或企业中工作时,样式一致性比任何单个样式元素都重要。
打开App,查看更多内容
随时随地看视频慕课网APP