可能重复:
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语义/语法.