这个班有多少个构造函数?

Fra*_*ger 57 c++ oop constructor

我正在为即将到来的C++考试做准备,并遇到了关于类和构造函数的问题:

Fraction类有多少个构造函数?"

class Fraction {
//...
public:
   Fraction(int numerator = 0, int denominator = 1);
//...
};
Run Code Online (Sandbox Code Playgroud)

我认为这只是一个,但他们建议有三个:

Fraction();
Fraction(n);
Fraction(n, d);
Run Code Online (Sandbox Code Playgroud)

或者换句话说:
具有默认值的函数是否为重载函数?

R S*_*ahu 55

只有一个构造函数对应于已发布的声明,而不是三个重载.

电话

Fraction();
Fraction(n);
Run Code Online (Sandbox Code Playgroud)

相当于:

Fraction(0, 1);
Fraction(n, 1);
Run Code Online (Sandbox Code Playgroud)

另一种说服自己只有一个与声明相对应的构造函数的方法是你只需要定义一个构造函数,而不是三个.

关于默认参数的C++ 11标准部分包含:

8.3.6默认参数

1如果在参数声明中指定了initializer子句,则此初始化子句用作默认参数.默认参数将用于缺少尾随参数的调用中.

2 [ 例子:声明

void point(int = 3, int = 4);
Run Code Online (Sandbox Code Playgroud)

声明一个可以用\ type的一个,一个或两个参数调用的函数int.它可以通过以下任何方式调用:

point(1,2); point(1); point();
Run Code Online (Sandbox Code Playgroud)

最后两个调用分别等同于point(1,4)point(3,4).- 末端的例子 ]

现在主要问题.

类Fraction有多少个构造函数?

如果框架问题的人想要包含移动构造函数和复制构造函数,这些构造函数由编译器隐式生成,除非显式删除,在构造函数集中,则答案是三.在这种情况下,问题是一个棘手的问题.

  • 编译器生成的复制和移动构造函数是否计数?如果是这样,答案仍然是3.对我来说,这似乎是一个_trick问题. (8认同)
  • 当我在教育和C++课程时,答案应该是3,以确保我们记住自动生成的默认和复制构造函数.我在2001年初到2006年之间接受过教育.如果这个问题来自较旧的试卷,那将是关于复制和默认构造函数,以确保学生记住,即使没有在代码中显示,他们也会在那里. (2认同)

πάν*_*ῥεῖ 27

具有默认值的函数是否为重载函数?

不,超载看起来像

Fraction();
Fraction(int numerator);
Fraction(int numerator, int denominator);
Run Code Online (Sandbox Code Playgroud)

并且每个都有自己的实现(定义),而具有默认参数的函数只有一个实现.


我认为这只是一个,但他们建议有3个:......

"Fraction有多少个构造函数?"

这是一个技巧问题,旨在欺骗您显示单个构造函数声明的可用调用变体.

给定代码片段的确切答案是3(在单词3中).

有一个专门的构造函数(提供三种调用变体),如果你不这样做,编译器会自动生成一个副本和移动构造函数delete,或者提供一个自定义的实现:

Fraction(int numerator = 0, int denominator = 1); // (1)
// Redundant, just for demonstration:
Fraction(const Fraction& rhs) = default; // (2)
Fraction(Fraction&& rhs) = default; // (3)
Run Code Online (Sandbox Code Playgroud)

所以对于这样的考试,如果你会回答

该类有一个构造函数

反正这是错的.如果你会回答

该类有三个构造函数(正如您所写,这是接受的答案)

你需要深入解释,为什么这么认为(如上所述).
在任何口语考试中,我都会要求你准备好原因,所以我会在学徒考试中做.


The*_*Zoo 18

您的问题的答案与这三个后续问题有关:

  1. 在C++ 11,C++ 11或C++ 14及更高版本之前?
  2. 隐式定义的构造函数是否计数?
  3. 会员是什么?不可复制成员的存在将删除隐式复制构造函数.

显式定义只是一个构造函数; 无论调用是否显式提供0,1或2个参数,编译器都将插入一个三参数调用.

在'11之前,没有移动构造函数,在'11中有两个隐式构造函数定义,Fraction(const Fraction &) noexcept并且Fraction(Fraction &&) noexcept,检查可访问的cppreference,在'14中存在隐式定义的移动构造函数更改的规则.

不幸的是,你得到的问题看起来很狡猾但技术性很强; 我希望你的班级不要过分简化C++,这是学习它的最糟糕方式.


sky*_*ack 5

您只有一个构造函数的声明.
另一方面:

如果为同一范围内的单个名称指定了两个或更多不同的声明,则称该名称为重载

因此,我不会在这里使用术语重载.