2

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

foo(MyClass a)

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

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

4

3 回答 3

11

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

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

于 2012-09-07T19:26:15.197 回答
5

有两种可能性。

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

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

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

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

于 2012-09-07T19:29:34.580 回答
1

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

于 2012-09-07T19:25:42.593 回答