指针与参考

给一个函数原始变量时,更好的做法是:

unsigned long x = 4; void func1(unsigned long& val) { val = 5; } func1(x); 

要么:

 void func2(unsigned long* val) { *val = 5; } func2(&x); 

IOW:有什么理由选择一个吗?

我的经验法则是:

使用指针如果你想要做指针运算(例如递增指针地址来逐步通过一个数组),或者你必须传递一个NULL指针。

否则使用参考。

我真的认为你会从建立下面的函数调用编码准则中受益:

  1. 和其他所有地方一样,常常是正确的。

    • 注意:除了别的以外,这意味着只有超值(参见第3项)和通过值传递的值(参见第4项)可能缺少const说明符。
  2. 如果值0 / NULL是当前上下文中的有效输入,则只能通过指针传递值。

    • 理由1:作为一个调用者 ,你看到,无论你通过什么,都必须处于可用状态。

    • 理由二:如所称的 ,你知道无论进来什么都在可用状态。 因此,不需要对该值进行NULL检查或错误处理。

    • 理由3:理论1和理论2将被编译器强制执行 。 如果可以的话,一定要在编译时发现错误。

  3. 如果函数参数是一个out-value,那么通过引用传递它。

    • 理由:我们不想打破项目2 …
  4. 只有当值是一个POD( 普通的旧数据结构 )或足够小(记忆方式)或其他方式足够便宜(时间方面)复制时,选择“通过值传递”通过“通过const引用”。

    • 理由:避免不必要的副本。
    • 注意: 足够小便宜不是绝对的可测量的。

这最终最终是主观的。 迄今为止的讨论是有用的,但我不认为这是正确的或决定性的答案。 很多将取决于风格的指导方针和您当时的需求。

虽然用指针有一些不同的功能(无论是否为NULL),但输出参数的最大实际区别仅仅是语法。 例如,Google的C ++风格指南( https://google.github.io/styleguide/cppguide.html#Reference_Arguments )只规定了输出参数的指针,并且只允许使用const的引用。 推理是可读性的:具有价值语法的东西不应该具有指针语义的含义。 我并不是说这一定是对还是错,但我认为这里的重点是这是一个风格问题,而不是正确性问题。

如果您要修改变量的值,您应该传递一个指针。 即使在技术上传递一个引用或指针是相同的,在你的用例中传递一个指针是更可读的,因为它“通告”这个值将被函数改变的事实。

如果你有一个参数,你可能需要指出缺少一个值,通常的做法是使参数成为一个指针值并传入NULL。

在大多数情况下(从安全角度来看)更好的解决方案是使用boost :: optional 。 这允许您通过引用传递可选的值,也可以作为返回值。

 // Sample method using optional as input parameter void PrintOptional(const boost::optional<std::string>& optional_str) { if (optional_str) { cout << *optional_str << std::endl; } else { cout << "(no string)" << std::endl; } } // Sample method using optional as return value boost::optional<int> ReturnOptional(bool return_nothing) { if (return_nothing) { return boost::optional<int>(); } return boost::optional<int>(42); } 

指针与指针 Refereces

引用不如指针强大:

1)一旦创建了一个引用,以后就不能引用另一个对象; 它不能被重新安装。 这通常是用指针来完成的。

2)引用不能为NULL。 指针通常被设置为NULL来表示它们没有指向任何有效的东西。

3)声明时必须初始化一个引用。 指针没有这样的限制

由于上述限制, C ++中的引用不能用于实现像链表 ,树等数据结构 。在Java中,引用没有上述限制,可以用来实现所有的数据结构。 Java中引用更强大是Java不需要指针的主要原因。

参考文献更安全,更易于使用:

1)更安全:由于引用必须被初始化,像野指针这样的通配符不可能存在。 仍然有可能引用不引用有效的位置

2)易于使用:引用不需要解引用操作符来访问值。 它们可以像正常变量一样使用。 只有在申报时才需要'&'运算符。 而且,对象引用的成员可以使用点运算符('。')来访问,与需要使用箭头运算符( – >)来访问成员的指针不同。

再加上上述原因,像复制构造函数参数那样的地方很少有地方不能使用指针。 在复制构造函数中必须使用参数传递参数。 同样的引用必须用于重载一些运算符,如++

引用是一个隐含的指针。 基本上你可以改变参考点的值,但是你不能改变参考来指向别的东西。 所以我的2美分是,如果你只想改变一个参数的值作为参考传递,但如果你需要改变参数指向一个不同的对象传递它使用一个指针。

考虑C#的关键字。 编译器要求方法的调用者将out关键字应用于任何out参数,即使它已经知道了。 这是为了提高可读性。 虽然对于现代IDE,我倾向于认为这是语法(或语义)突出显示的工作。

尽可能使用参考,必要时使用指针。 从C ++ FAQ:“什么时候应该使用引用,什么时候应该使用指针?”

除非有一个你想改变/保持你传入的内容的理由,否则通过const引用传递。

在大多数情况下,这将是最有效的方法。

确保你对每个你不希望改变的参数使用const,因为这不仅可以保护你在函数中做一些愚蠢的事情,而且可以很好地向其他用户指示函数对传入值的作用。 这包括当你只想改变什么指向…

指针:

  • 可以分配nullptr (或NULL )。
  • 在调用网站你必须使用&如果你的类型不是一个指针本身,明确你正在修改你的对象。
  • 指针可以被反弹。

参考文献:

  • 不能为null。
  • 一旦绑定,不能改变。
  • 呼叫者不需要明确地使用&。 这被认为有时是不好的,因为你必须去执行函数来查看你的参数是否被修改。