我作为对复制构造的力学有点混乱。纠正我,如果我错了:

如果一个方法需要作为参数的对象的引用,并且所述类定义了一个拷贝construtor,则类使用构造函数来创建其自身的副本以及传递给函数,而不是原来的一个参考宾语?

此外,可调用

Object * obj = new Object(&anotherObject);

创建anotherObject的副本?

有帮助吗?

解决方案

没有,如果函数采取的引用:

void f1( Object & o );   // call by reference

则不复制。如果函数取值:

void f2( Object o );   // call by value

然后副本通过使用拷贝构造编译器创建的。

是的,当你说:

Object * obj = new Object(anotherObject);   // not &anotherObject

拷贝构造函数明确地使用(假设anotherObject是Object类型的。)没有什么神奇的关于使用new的是在这里,但是 - 在这种情况下:

Object obj2(anotherObject);

拷贝构造也被使用。

其他提示

如果一个方法需要作为参数以一个对象的引用,拷贝构造将不被调用。如果是这样的话,则到拷贝构造本身的呼叫,这样就造成一个无限循环(因为它需要一个参考作为参数)。

这行不调用拷贝构造函数的一种有效方式。它期望的参考作为参数,而不是一个指针。

这是你是一个方法调用的其实并不重要这里。一个函数调用期间的参考参数初始化没有来自独立引用初始化不同的并且由相同的规则。

参考初始化的规则是有点复杂,但底线是,如果初始化是一个左值(在你的情况下该方法调用的参数)与参考的类型是相同的类型初始化(参数的IE类型是一样的参数类型),那么将参考直接结合。即没有副本被创建。

Object a; // class type
Object &r = a; // no copying
const Object &cr = a; // no copying

如果这些不符合要求(例如,如果初始化器是一个rvalue,例如),那么这一切取决于。在某些情况下,可能会复制和将发生。例如

const Object &tr = Object();

可以由编译器被解释为

const Object &tr = Object(Object(Object(Object())));

与实现相关的有限数量的copyings。当然,为了提高效率,编译器通常试图不创建不必要的复制,即使当他们被允许进行复制。

这经常搅拌辩论关于编译器的复制行为的有效性一个典型的例子是在像表达式基准初始化以下各项之一

Object a;
const Object &r = <some condition> ? a : Object();

一个熟悉C ++引用语义人员将理解,像上面的表达式是可能在参考初始化以执行多余拷贝的标准的许可的理由。

没有在这两种情况下。在第一种情况下,参照该对象本身被传递并且不创建副本。在第二种情况下,你传递一个指针object的,因此没有创建拷贝构造函数。所以对象应该有一个构造(未复制构造函数),这是一样的东西object(anotherClass*)

复制构造仅称为经过时的通过值,而不是通过引用。通过参考无需复制(这是一个什么样的引用是部分!),所以没有拷贝构造函数调用。

是使用放置新像这样:

Object dstObject;
new(&dstObject) Object(&anotherObject);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top