2

我尝试使用复制构造函数 using 语句:

X y = X();

但是没有调用复制构造函数。我正在使用 g++ 4.1.0。我在类中设置了 X(const X&) 和 X(x&) 构造函数。

这应该有效还是我在代码中做了一些非常基本的问题?

我的课程代码是

class A
{
 public:
  int i;

  A(int ii)
  {
   i = ii;
  }

  A(const A&)
  {
   i = 5;
  }

  A(A&)
  {
   i = -1;
  }

  A()
  {
   i = 5000;
  }
};

当我使用 A a = A();or A a = A(100);时,它不起作用,但是当我使用它时A a(b);A a = b;它可以正常工作。

我错过了什么?我看到根据维基百科,它应该可以工作,但在我的情况下它不起作用:(。

提前感谢您的所有回答和评论。

4

4 回答 4

13

在某些情况下,允许编译器省略对复制构造函数的调用。从临时对象初始化对象就是其中之一。在这种情况下,临时对象只是就地构造,而不是构造一个临时对象,然后将其复制到命名对象中。

您可以通过构造一个命名对象然后对其进行复制来调用复制构造函数:

X x;
X y = x;
于 2010-08-03T14:58:45.547 回答
1
X y = X();

调用默认构造函数。复制构造函数是引用要复制的实例的构造函数。

复制构造函数的要点是获取另一个相同类型的对象,并对其进行复制。其他一切都不是复制构造函数。

于 2010-08-03T14:58:19.030 回答
0

复制构造函数由语句X x(y);或调用X x = y;

当您调用 时X x = X();,将调用默认构造函数。

当您调用 时X x = X(100);,将调用具有一个参数的构造函数。这些不是复制构造函数。

于 2010-08-03T15:00:35.353 回答
-1

当您用另一个对象初始化一个对象时,会调用复制构造函数:)。在您的第一个示例中,不调用复制 ctor 是完全自然的,只会调用具有合适参数列表的构造函数。

于 2010-08-03T15:35:01.853 回答