我正在攻读使用练习考试的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)
调用复制构造函数两次以传递Fraction对象B和C的副本?
并且是 -
F = task( H, C );
调用默认赋值运算符以及F是否已作为初始化的Fraction对象存在?
答案 0 :(得分:1)
您基本上想知道何时调用默认构造函数和复制构造函数。
关于你的第一个问题:
Fraction E[4], F = D; // Line 3
E[4]
是Fraction
个对象的数组,由于您没有显式调用任何其他构造函数来初始化这些对象,因此会调用默认构造函数4次。因为在第2行已经构造了对象D
,因此使用复制构造函数构造F
,在这种情况下,编译器会为您生成一个,因为您没有为自己定义一个。
所以在这种情况下,有4个默认构造函数调用和一个复制构造函数调用。
在第4行,两个对象都调用默认构造函数,因此在默认的ctor上调用两次。
debug(B, C)
call the copy constructor twice to pass copies of Fraction objects B and C?
是的,因为参数是按debug
函数中的值传递的,所以同时为B
和C
通常,在以下情况下调用复制构造函数:
F= D
或F(D)
)实例化一个对象时希望这能为您提供足够的信息来理解代码。