何时通过引用传递以及何时通过C++中的指针传递?

use*_*855 46 c++

常见情况:

  1. 将std :: string传递给函数foo(std :: string*)或foo(std :: string&);
  2. 将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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢Ajay

Dav*_*ley 26

参考文献更容易正确.

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

特别是,当一个参数传递给一个函数,并且该函数不会改变它,并且它不是一个内置类型时,传递const引用.它与pass by value非常相似,除了它不需要复制构造函数调用.

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

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


Luc*_*cas 25

一个好的经验法则:"尽可能使用参考,必要时使用指针".


小智 6

在我之前的工作中,我们的规则是普通的引用实际上从未使用过.相反,我们同意:

  • 按值传递(对于复制对象,所有基元,小值类型,std :: string,非常小或重新计算的字符串)
  • 通过const引用传递(用于只读访问大对象)
  • 如果需要读写访问权,则通过指针传递

如果每个人都遵循这些规则,您可以假设传递给函数的参数不会被修改,除非他们的地址被采用.它对我们有用.


Mat*_* M. 5

我真的不明白你为什么遇到这些麻烦:

std::map < std::string, std::vector<std::string> > adjacencyMap;
std::vector<std::string>& sFriends = adjacencyMap["s"];
sFriends.push_back("a");
sFriends.push_back("v");
sFriends.push_back("g");
Run Code Online (Sandbox Code Playgroud)

你为什么干涉shared_ptr这里?这种情况肯定不需要它!