通过引用调用vs Pointer参数

use*_*237 7 c++

可能重复:
FAQ:如何将对象传递给C++中的函数?
指针与参考

大家好,
在c/c ++中,我们可以通过引用传递对象或传递对象的指针.
例如:
我想创建一个函数,它将字符串向量作为输入,并输出一个包含每个字符串的值的映射.函数的返回值是bool,表示成功或失败.

功能(按参考调用)

bool calculateSomeValue( vector<string> input, map<string, double>& result)
{
//// bla bla bla
return true/false;
}

功能(使用指针)

bool calculateSomeValue( vector<string> input, map<string, double>* result)
{
//// bla bla bla
return true/false;
}

哪一个最好?有没有人知道这两种选择的利弊?

提前致谢.

Mic*_*yan 11

这是一种风格问题.在Google(请参阅Google C++风格指南)中,首选以下内容:

bool CalculateSomeValue(
    const vector<string>& input, map<string, double>* result);
Run Code Online (Sandbox Code Playgroud)

这是因为使用指针需要在调用站点显式使用&符号:

 CalculateSomeValue(input, &result);
Run Code Online (Sandbox Code Playgroud)

与使用引用类型调用它的方式相反:

 CalculateSomeValue(input, result);
Run Code Online (Sandbox Code Playgroud)

通过在参数被修改的情况下强制使用&符号,在呼叫站点清楚会发生什么.使用引用时,有必要查找每个函数的文档,以了解它是否有可能修改其输入参数.

但是,指针的使用也有其缺点.特别是,指针的使用意味着您将处理null的责任从指针被解除引用的调用者(如果该变量是指针而不仅仅是具有局部变量的表达式的地址)转移到函数.也就是说,当使用指针类型时,CalculateSomeValue需要检查nullptr(或需要清楚地记录它需要在调用者中进行此检查),而引用类型的使用是自我记录的并且清楚地表明非空引用是预期.

对于这种特殊的情况,我个人强烈建议采用混合方法:

bool CalculateSomeValue(
   const std::vector<std::string>& input,
   Output<map<string, double>> result);
Run Code Online (Sandbox Code Playgroud)

... Output<T>由具有签名的函数创建的位置:

 template<typename T> Output<T> WriteTo(T& output_ref);
Run Code Online (Sandbox Code Playgroud)

...并在Output<T>重载运营商->,*等等.这基本上是强制调用点是在事实的投入将需要被突变明确:

 CalculateSomeValue(input, WriteTo(result));
Run Code Online (Sandbox Code Playgroud)

......而不是:

 CalculateSomeValue(input, result);
Run Code Online (Sandbox Code Playgroud)

...同时获得引用的非null语义/语法.