c++ - 默认构造函数调用

标签 c++

我正在使用练习考试来准备 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 次。我看不出我的错误在哪里。

我的另一个问题在以下问题中 -

  1. 考虑图 2 中的源代码(在上一页)。当。。。的时候 标记为“Line 7”和“Line 8”的语句被编译和执行,有多少 将对每个类“Fraction”的构造函数进行调用 那些陈述?

    答案是-D) Line 7: 1 call Line 8: 1 call

        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。这实际上是对默认赋值的操作运算符(operator)?至于第 8 行,这是因为它返回一个 Fraction 类型的对象而调用复制构造函数吗?

我在这里还有几个问题 -

会 -

debug(B, C)

两次调用复制构造函数以传递 Fraction 对象 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 行,两个对象都调用了默认构造函数,因此在默认构造函数上调用了两次。

debug(B, C)
call the copy constructor twice to pass copies of Fraction objects B and C?

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

一般情况下,拷贝构造函数会在以下情况被调用:

  1. 当用现有对象实例化一个对象时(如 F= DF(D))
  2. 按值传递对象时。
  3. 当对象按值从函数返回时。

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

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

相关文章:

c++ - 矩阵的相关系数

c++ - GCC 4.9 constexpr 错误的解决方法

c++ - 如何使用 TBB 并行化 std::partition

c++ - 使用英特尔 C++ 编译器 2015 Windows 构建 Boost 1.56

c++ - C 或 C++ 中用于数字的二次方的一元运算符

c++ - 统计数学问题

c++ - 我必须从工厂返回一个指针吗?

c++ - 在 C++ DLL 项目中使用 STL

c++ - 使用 GraphicsMagick 调整动画 GIF 的大小

c++ - 如何在 MFC 功能包中获取功能区控件以处理 ID_WINDOW_TILE_VERT