Fra*_*ger 57 c++ oop constructor
我正在为即将到来的C++考试做准备,并遇到了关于类和构造函数的问题:
Fraction类有多少个构造函数?"
Run Code Online (Sandbox Code Playgroud)class Fraction { //... public: Fraction(int numerator = 0, int denominator = 1); //... };
我认为这只是一个,但他们建议有三个:
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 [ 例子:声明
Run Code Online (Sandbox Code Playgroud)void point(int = 3, int = 4);声明一个可以用\ type的一个,一个或两个参数调用的函数
int.它可以通过以下任何方式调用:Run Code Online (Sandbox Code Playgroud)point(1,2); point(1); point();最后两个调用分别等同于
point(1,4)和point(3,4).- 末端的例子 ]
现在主要问题.
类Fraction有多少个构造函数?
如果框架问题的人想要包含移动构造函数和复制构造函数,这些构造函数由编译器隐式生成,除非显式删除,在构造函数集中,则答案是三.在这种情况下,问题是一个棘手的问题.
πάν*_*ῥεῖ 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
您的问题的答案与这三个后续问题有关:
显式定义只是一个构造函数; 无论调用是否显式提供0,1或2个参数,编译器都将插入一个三参数调用.
在'11之前,没有移动构造函数,在'11中有两个隐式构造函数定义,Fraction(const Fraction &) noexcept并且Fraction(Fraction &&) noexcept,检查可访问的cppreference,在'14中存在隐式定义的移动构造函数更改的规则.
不幸的是,你得到的问题看起来很狡猾但技术性很强; 我希望你的班级不要过分简化C++,这是学习它的最糟糕方式.
| 归档时间: |
|
| 查看次数: |
6505 次 |
| 最近记录: |