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

时间:2012-09-07 19:24:54

标签: c++ copy-constructor

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

foo(MyClass a)

对象a正在按值传递,这意味着它正在被复制。

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

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:5)

有两种可能性。

首先:您没有指定复制构造函数。

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

第二:您将复制构造函数声明为私有或实际delete d it(在C ++ 11中)。

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

答案 2 :(得分:1)

编译器创建一个默认的复制构造函数。