在不更改函数中的对象或指针时,将对象或指针作为值传递

Pass object or pointer as value when not changing that object in function

本文关键字:指针 对象 值传 函数      更新时间:2023-10-16

在 c++ 中,有多种方法可以将对象作为参数传递给函数。我一直在阅读有关按值和引用传递的信息。

这些链接非常有用:

http://www.yoda.arachsys.com/java/passing.htmlhttp://www.yoda.arachsys.com/csharp/parameters.html

在我现在想知道的 c++ 的情况下,我也看到了这篇文章:

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

这些涉及按值传递和引用传递之间的差异。最后一篇文章还描述了这个问题的一些利弊。我想知道在函数中未修改对象的情况下将参数作为值传递的利弊。

int f(sockaddr_in s) {
// Don't change anything about s
}
int f(sockaddr_in *s) {
// Don't change anything about s
}

两者都允许我访问它拥有的变量。但我想知道我应该使用哪一个,以及为什么。

在第一个示例中,f()获取原始对象的副本,因此不可能更改后者。但是,调用复制构造函数,这可能非常昂贵,因此不建议作为通用方法。

在第二个示例中,f()获取指针或(f(obj&x))对原始对象的引用,并允许对其进行修改。如果函数只接受const指针或引用,如f(const object&x),它不能合法地更改对象。在这里,没有复制。因此,通过常量引用传递是参数的标准方法,不应修改。

你忽略了 c++ 的一个基本内容:常量正确性:声明 'int f(sockaddr_in *s)' 违反了这一点。"int f(sockaddr_in s)"不是,也可能是合理的(无论如何sockaddr_in很小或被复制)。因此,"int f(const sockaddr_in&s)"和"int f(sockaddr_in s)"可能都是一个不错的选择。