我正在使用实践考试来学习C++考试。我在确定何时调用某些构造函数时遇到问题。代码是-

using namespace std;
#include <iostream>

class Fraction
{
  private:
   int numerator, denominator;
  public:
   Fraction( int = 0, int = 1 );
   friend ostream& operator<<( ostream&, const Fraction& );
  };

 void debug( Fraction, Fraction );
 Fraction task( Fraction&, const Fraction& );

int main()
  {
    Fraction * A[6], * B; // Line 1
    Fraction C( 3 ), D( C ); // Line 2
    Fraction E[4], F = D; // Line 3
    Fraction G, H( 3, 4 ); // Line 4
    debug( C, D ); // Line 5
    B = new Fraction; // Line 6
    F = task( H, C );
    delete B;
    return 0;
  }

 void debug( Fraction X, Fraction Y )
 {
   cout << X << endl << Y << endl;
 }

 Fraction task( Fraction& X, const Fraction& Y )
 {
   Fraction Z;
   Z = Fraction( 5, 2 ); // Line 7
   return 1; // Line 8
 }

现在,我认为默认的复制构造函数是在3种类型的实例中调用的。

范例1-
        Fraction A(1,2);

        Fraction B(A);

示例2-
        Fraction A(1,2);

        Fraction A = B;

3-从函数返回对象时

4-当对象作为参数传递给函数时

我似乎无法回答两个问题-

问题1-考虑上面的源代码。当。。。的时候
标有“第3行”和“第4行”的语句将被编译和执行,有多少条
对于每个类,都将调用类“Fraction”的构造函数
这些陈述?

答案是-D)第3行:5个电话第4行:2个电话

这个问题的答案是D。但是,当我回答时,我得到了不同的结果-
    Fraction E[4], F = D; // Line 3

我看到数组E [4]的默认构造函数被调用了5次,但我认为该语句也等效于-
    Fraction E[4], Fraction F(D);

因此,默认构造函数被调用5次,而复制构造函数被调用一次。显然,这是不正确的,因为构造函数仅被调用5次。我看不到我的错误在哪里。

我的另一个问题是以下问题-
  • 考虑图2中的源代码(在上一页中)。当。。。的时候
    标有“第7行”和“第8行”的语句将被编译和执行,有多少条
    对于每个类,都将调用类“Fraction”的构造函数
    这些陈述?

    答案是-D)7号线:1个电话8号线:1个电话
        Fraction task( Fraction& X, const Fraction& Y )
        {
          Fraction Z;
          Z = Fraction( 5, 2 ); // Line 7
          return 1; // Line 8
        }
    

    我最初以为会调用默认构造函数为Fraction(5,2)创建一个临时对象,然后将复制构造函数将Fraction(5,2)复制到Z。这实际上是默认赋值运算符的操作吗?至于第8行,是否因为返回的是Fraction类型的对象而调用了复制构造函数?

  • 我在这里时还有其他几个问题-

    将 -
    debug(B, C)
    

    调用副本构造函数两次以传递分数对象B和C的副本?

    并且是 -
    F = task( H, C );
    

    调用默认赋值运算符以及F已作为初始化的Fraction对象存在吗?

    最佳答案

    您基本上想知道何时调用默认构造函数和复制构造函数。

    对于第一个问题:

    Fraction E[4], F = D; // Line 3
    
    E[4]Fraction对象的数组,由于没有显式调用任何其他构造函数来初始化这些对象,因此它将调用默认构造函数4次。由于在第2行中已经构造了对象D,因此,使用复制构造函数构造了F,在这种情况下,编译器会为您生成一个,因为您没有为自己定义一个。
    因此,在这种情况下,有4个默认构造函数调用和1个副本构造函数调用。
    在第4行,两个对象都调用默认构造函数,因此两次使用默认ctor。
    debug(B, C)
    call the copy constructor twice to pass copies of Fraction objects B and C?
    

    是的,因为参数是通过debug函数中的值传递的,所以BC都调用了复制构造函数

    通常,在以下情况下会调用复制构造函数:
  • 用现有对象实例化一个对象(如F= DF(D))时
  • 通过值传递对象时。
  • 从函数按值返回对象时。

  • 希望这为您提供了足够的信息来理解代码。

    关于c++ - 默认构造函数调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15594290/

    10-11 22:13
    查看更多