C++ 引用调用与指针参数

C++ 引用调用与指针参数,c++,C++,可能重复: 大家好, 在c/c++中, 我们可以通过引用或对象的传递指针传递对象作为调用。 例如: 我想创建一个函数,它将字符串向量作为输入,并输出一个映射,其中包含每个字符串的一些值。函数的返回值为bool,表示成功或失败 函数(通过引用调用) 布尔计算方法值(矢量输入、映射和结果) { ////呜呜呜呜 返回真/假; } 函数(使用指针) 布尔计算方法值(矢量输入,映射*结果) { ////呜呜呜呜 返回真/假; } 哪一个最好?有人知道这两种选择的利弊吗 提前谢谢 bool calcu

可能重复:

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

函数(通过引用调用)

布尔计算方法值(矢量输入、映射和结果) { ////呜呜呜呜 返回真/假; } 函数(使用指针)

布尔计算方法值(矢量输入,映射*结果) { ////呜呜呜呜 返回真/假; } 哪一个最好?有人知道这两种选择的利弊吗

提前谢谢

bool calculateSomeValue( vector<string> input, map<string, double>&* result)
编译错误:

程序cpp:7:错误:无法声明 指向“结构A&”的指针


Ideone示例:

您的第二个代码示例似乎不正确,因为您试图接受指向不应编译的引用的指针

通过引用传递和通过指针传递同样有效(如果我错了,有人会纠正我,但我的理解是,引用本质上是一个自动创建的指针,然后无缝地取消引用),但建议通过引用传递,因为这样更安全:

  • 您不能有空引用
  • 您不能更改引用的地址,而指针允许您更改

有些人更喜欢显式指针语法,它清楚地表明它是指向传入对象的指针(您必须取消引用)。

这是风格问题。在谷歌(见),以下内容将是首选:

bool CalculateSomeValue(
    const vector<string>& input, map<string, double>* result);
与使用引用类型调用它的方式相反:

 CalculateSomeValue(input, result);
在参数被修改的情况下,通过强制使用符号AND,在调用站点可以清楚地看到将发生什么。使用引用时,有必要查找每个函数的文档,以了解它是否有可能修改其输入参数

然而,使用指针也有其缺点。特别是,指针的使用意味着您将处理null的责任从指针将被取消引用的调用方(如果变量是指针,而不仅仅是带有局部变量的表达式地址)转移到函数。也就是说,当使用指针类型时,
calculateMeValue
需要检查
nullptr
(或者需要清楚地记录它需要在调用者中进行此检查),而引用类型的使用是自文档化的,并且清楚地表明需要非空引用

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

bool CalculateSomeValue(
   const std::vector<std::string>& input,
   Output<map<string, double>> result);
。。。与之相反:

 CalculateSomeValue(input, result);

。。。同时获得引用的非空语义/语法。

最佳解决方案不存在。这是一个又一个案例

例如,在某些情况下,next可能更好:

map<string, double> calculateSomeValue( const vector<string> &input )
{
  map<string, double> res;
// do something with input to form the output
  return res;
}
map calculateSomeValue(常量向量和输入)
{
地图资源;
//对输入做一些事情以形成输出
返回res;
}

但是,如果可以的话,您更愿意使用标准算法,我假设第二个算法应该是逐点的,而不是指向引用的指针

两者之间的决定只是风格和品味的问题。两行的编译结果可能相同


通常,对于输出参数,C++样式指南称它应该是指针。

< P>唯一的使用引用的时间是在实现需要它们的标准运算符时。

然而,除此之外,对于任何应用程序方法,指针都应该优先于引用

  • 用户对象通常存储在指针(智能或其他)中。在按需创建对象时,对引用的“始终有效”约束过于严格。这使得参考参数不方便使用,因为需要执行笨拙的操作来传递值<代码>referenceFunc((*pObj))

  • 通过引用传递是尝试实现契约范式的廉价替代品。哪个C++不支持。< /p>
  • 该pass-by引用上的所有(*somePtr)操作都意味着您无论如何都将得到null指针进行调试,只是因为null指针看起来不像指针,所以更加模糊

  • 当程序员不能通过简单的检查来判断函数的哪些参数可能会改变时,不要担心维护问题


如果参数不是可选的,我发现C++很多DEVS更喜欢通过引用。然而,许多人喜欢仅仅为了视觉提示而通过指针。这是c语言遗留下来的一点东西,随着程序处理引用和指针混合使用的增长,c语言会受到侵蚀

您可以假定引用不为null,但对于指针,不应假定为null。在这种情况下,您必须引入先决条件搭建/检查,以确保上游的人不相信该论点是可选的——如果您是防御性的

就个人而言,我更喜欢通过引用传递,并使用描述性方法/函数/变量名(如果您只详细说明标签,那么人们必须更频繁地查看文档)。这样可以保持程序的意图清晰,并避免额外的书面检查<代码>获取*或
更新*
可能比
计算*
更明显

使用引用是一致的、定义良好的,并且生成更简单的程序,因为您不需要处理混合变量/参数类型


在这种情况下,您选择哪一种并没有多大区别,只是在使用过程中保持一致。我使用的另一个提示是将修改后的参数放在同一位置。具体来说,它们位于常量参数之前。

指向引用的指针?那很有趣@user619237:搜索
指针与ref
 CalculateSomeValue(input, result);
bool CalculateSomeValue(
   const std::vector<std::string>& input,
   Output<map<string, double>> result);
 template<typename T> Output<T> WriteTo(T& output_ref);
 CalculateSomeValue(input, WriteTo(result));
 CalculateSomeValue(input, result);
map<string, double> calculateSomeValue( const vector<string> &input )
{
  map<string, double> res;
// do something with input to form the output
  return res;
}