在函数中不更改对象时,将对象或指针作为值传递 在C++中,有多种方法将对象作为参数传递给函数。我一直在阅读有关传递值和引用的内容
这些链接非常有用: <>和在我现在想知道的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 } 两者都允许我访问它拥有的变量。但是我
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的重复,这是一个非常有用的链接。糟糕的是,我之前没有找到。