Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在函数中不更改对象时,将对象或指针作为值传递 在C++中,有多种方法将对象作为参数传递给函数。我一直在阅读有关传递值和引用的内容_C++_Pointers_Parameter Passing_Pass By Value - Fatal编程技术网

在函数中不更改对象时,将对象或指针作为值传递 在C++中,有多种方法将对象作为参数传递给函数。我一直在阅读有关传递值和引用的内容

在函数中不更改对象时,将对象或指针作为值传递 在C++中,有多种方法将对象作为参数传递给函数。我一直在阅读有关传递值和引用的内容,c++,pointers,parameter-passing,pass-by-value,C++,Pointers,Parameter Passing,Pass By Value,这些链接非常有用: 和在我现在想知道的C++的情况下,我也看到了这篇文章: 这些讨论了按值传递和引用传递之间的差异。最后一篇文章也描述了一些关于这个问题的利弊。我想知道在函数中未修改对象的情况下,将参数作为值传递的利弊 int f(sockaddr_in s) { // Don't change anything about s } int f(sockaddr_in *s) { // Don't change anything about s } 两者都允许我访问它拥有的变量。但是我

这些链接非常有用:

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

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

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)”可能都是一个不错的选择。

在第二个示例中,您的意思是
int f(sockaddr_in&s){
通过引用传递,而不是
*s
,否则您传递的是指针,它不完全相同。这里没有通过引用传递。除此之外,还有指针(或引用)经常被传递,这样就可以避免复制整个对象。可能是@stijn的重复,这是一个非常有用的链接。糟糕的是,我之前没有找到。