C++函数参数通过值传递

oop*_*psi 2 c++ copy-constructor

我知道当你以这种方式调用函数时:

foo(MyClass a)
Run Code Online (Sandbox Code Playgroud)

该对象a正在通过值传递,这意味着它正在被复制.

我的问题是它是如何被复制的?说我的类没有复制构造函数,所以如果使用浅复制传递它,那么对象可能会在函数内部发生变化?

Cod*_*ash 11

编译器自动生成复制构造函数的代码并执行成员明智的复制.编译器调用的复制构造函数执行成员明智的复制,这确实是浅拷贝.

如果类中的指针存在,则不建议按值传递对象.即使指针不存在,但存在十几个其他数据成员,它们也需要很多时间来复制.通过引用传递它,并且const如果你不希望它的值被更改,就可以创建它.


bit*_*ask 5

有两种可能性.

第一:您没有指定复制构造函数.

在这种情况下,MyClass::MyClass(MyClass const&)将使用默认的复制构造函数.这将尝试复制构造所有MyClass的成员(递归地,因为这些成员本身可能有成员).如果这些成员中的任何一个不是可复制构造的,那么您的默认复制构造函数也将失败(请参阅下一点).

第二:你声明了复制构造函数是私有的还是实际的delete(在C++ 11中).

在这种情况下,您将无法向此函数传递任何内容,因为编译器将需要访问您拒绝它的复制构造函数.这将导致编译时错误.