gpt4 book ai didi

c++ - 当我们将对象作为参数按值传递给方法时,为什么会调用复制构造函数?

转载 作者:行者123 更新时间:2023-12-03 01:01:24 26 4
gpt4 key购买 nike

当我将对象作为参数按值传递给函数时,为什么会调用复制构造函数?请看我下面的代码:我将一个类的对象作为参数按值传递给函数 display(),但它在控制点击 display( ) 函数。我不明白为什么。

#include "stdafx.h"
#include <iostream>
using namespace std;

class ClassA
{
private:
int a, b;
public:
ClassA()
{
a = 10, b = 20;
}
ClassA(ClassA &obj)
{
cout << "copy constructor called" << endl;
a = obj.a;
b = obj.b;
}
};
void display(ClassA obj)
{
cout << "Hello World" << endl;
}
int main()
{
ClassA obj;
display(obj);
return 0;
}

最佳答案

详细说明已经给出的两个答案:

当您将变量定义为与其他变量“相同”时,基本上有两种可能性:

ClassA aCopy = someOtherA; //copy
ClassA& aRef = someOtherA; //reference

当然有 const 引用和右值引用,而不是非常量左值引用。我想在这里指出的主要一点是,aCopy 独立于 someOtherA,而 aRef 实际上与 是相同的变量someOtherA,它只是它的另一个名称(别名)。

对于函数参数来说,基本是一样的。当参数是引用时,它会在调用函数时绑定(bind)到参数,并且它只是该参数的别名。这意味着,您对参数执行的操作,您对参数执行的操作:

void f(int& iRef) {
++iRef;
}

int main() {
int i = 5;
f(i); //i becomes 6, because iRef IS i
}

当参数是一个值时,它只是参数的拷贝,因此无论您对参数做什么,参数都保持不变。

void f(int iCopy) {
++iCopy;
}

int main() {
int i = 5;
f(i); //i remains 5, because iCopy IS NOT i
}

当您按值传递时,参数是一个新对象。它必须是,因为它与论证不同,所以它是独立的。创建作为参数拷贝的新对象意味着调用复制构造函数或移动构造函数,具体取决于参数是左值还是右值。在您的情况下,使函数按值传递是不必要的,因为您只读取参数。

有来自 GotW #4指南:

Prefer passing a read-only parameter by const& if you are only going to read from it (not make a copy of it).

关于c++ - 当我们将对象作为参数按值传递给方法时,为什么会调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16728441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com