默认构造函数调用
Default Constructor Calls
我正在用练习考试来准备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行"answers"第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行"answers"第8行"的语句被编译并执行,有多少对类"Fraction"的构造函数的调用将针对每个这些语句?
答案是- D)行7:1 call行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。这实际上是默认赋值操作符的操作吗?至于第8行,调用复制构造函数是因为它返回一个Fraction类型的对象吗?
我在这里还有几个问题-
would -
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个默认构造函数调用和一个复制构造函数调用。在第4行,两个对象都调用默认构造函数,所以在默认的函数上调用两次。
debug(B, C)
call the copy constructor twice to pass copies of Fraction objects B and C?
是的,因为在debug
函数中参数是按值传递的,所以B
和C
都调用复制构造函数
通常,复制构造函数在以下情况下调用:
- 当用现有对象实例化一个对象时(如
F= D
或F(D)
) - 按值传递对象时。
- 当一个对象从函数按值返回时。
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 没有用于调用默认构造函数的匹配函数
- 为什么指针对象没有调用默认构造函数
- 调用默认构造函数时不引用它
- 为什么我的对象声明不调用默认构造函数?
- 为什么要尝试调用默认构造函数?
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 是否可以从移动构造函数调用默认构造函数?
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 声明对象而不调用默认构造函数
- 作为参数的空初始值设定项列表不调用默认构造函数
- 如果类划分为单独的文件,则不调用默认构造函数
- 为什么"S x({})"仅在GCC 7/C++1z模式下调用默认构造函数?
- C++ 继承基构造函数,但仍调用默认派生构造函数
- 带有默认参数的宏包装函数调用
- 在返回语句中调用默认构造函数
- 从定义的复制构造函数调用默认(隐式)复制构造函数
- visual C++构造函数调用默认构造函数