클래스에는 몇 개의 생성자가 있습니까?
다가오는 C ++ 시험을 준비 중이며 클래스 및 생성자에 대한이 질문을 발견했습니다.
Fraction 클래스에는 몇 개의 생성자가 있습니까? "
class Fraction { //... public: Fraction(int numerator = 0, int denominator = 1); //... };
나는 그것이 단 하나라고 생각했지만 그들은 세 가지가 있다고 제안했습니다.
Fraction();
Fraction(n);
Fraction(n, d);
즉
, 기본값이있는 함수가 오버로드 된 함수입니까?
게시 된 선언에 해당하는 생성자는 세 개가 아니라 하나뿐입니다.
전화
Fraction();
Fraction(n);
다음과 같습니다.
Fraction(0, 1);
Fraction(n, 1);
선언에 해당하는 생성자가 하나뿐임을 확신하는 또 다른 방법은 생성자를 세 개가 아니라 하나만 정의하면된다는 것입니다.
기본 인수에 대한 C ++ 11 표준 섹션은 다음과 같습니다.
8.3.6 기본 인수
1 initializer-clause 가 매개 변수 선언에 지정되면 이 initializer-clause 가 기본 인수로 사용됩니다. 기본 인수는 후행 인수가 누락 된 호출에 사용됩니다.
2 [ 예 : 선언
void point(int = 3, int = 4);
0, 1 또는 두 개의 인수로 호출 할 수있는 함수를 선언합니다
int
. 다음 방법 중 하나로 호출 할 수 있습니다.point(1,2); point(1); point();
마지막 두 호출은 동등
point(1,4)
하고point(3,4)
각각. -예제 종료 ]
이제 주요 질문입니다.
Fraction 클래스에는 몇 개의 생성자가 있습니까?
질문을 구성한 사람이 명시 적으로 삭제되지 않는 한 컴파일러에 의해 암시 적으로 생성되는 이동 생성자와 복사 생성자를 생성자 집합에 포함시키려는 경우 대답은 3 입니다. 이 경우 질문은 속임수 질문입니다.
기본값이있는 함수가 오버로드 된 함수입니까?
아니요. 과부하는 다음과 같습니다.
Fraction();
Fraction(int numerator);
Fraction(int numerator, int denominator);
기본 매개 변수가있는 함수는 단일 구현을 갖지만 각각 고유 한 구현 (정의)을 갖습니다.
나는 그것이 단 하나라고 생각했지만 그들은 3이 있다고 제안했습니다. ...
"Fraction 클래스에는 몇 개의 생성자가 있습니까?"
단일 생성자 선언에 대해 사용 가능한 호출 변형을 보여 주도록 설계된 속임수 질문 입니다.
명확한 주어진 코드에 대한 대답은 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)
따라서 그러한 시험에 대해 대답한다면
클래스에는 하나의 생성자가 있습니다.
어쨌든 그건 틀렸어요. 당신이 대답한다면
클래스에는 세 개의 생성자가 있습니다 (당신이 작성한대로 허용되는 답변입니다)
왜 그렇게 생각하는지 자세히 설명해야합니다 (위에서 설명한대로).
구술 시험에서 나는 그 이유를 정확히 백업 해달라고 요청하고 그래서 견습생 시험에서 할 것입니다.
귀하의 질문에 대한 답변은 다음 세 가지 후속 질문과 관련이 있습니다.
- Before C++ 11, C++ 11, or C++14 and beyond?
- Do the implicitly defined constructors count?
- What are the members? The presence of a non-copyable member will delete the implicit copy constructor.
The explicit definition is only one constructor; the compiler will insert a three-argument call regardless of whether the call explicitly supplies 0, 1, or 2 arguments.
In pre-'11 there are no move constructors, in '11 there are two implicit constructor definitions, Fraction(const Fraction &) noexcept
and Fraction(Fraction &&) noexcept
, check the accessible cppreference, in '14 the rules of when there is an implicitly defined move constructor change.
The question you got is unfortunately innocently looking but quite technical; I hope your class does not insist on oversimplifying C++, it is the worst way to learn it.
You have only one declaration of a constructor.
On the other side:
When two or more different declarations are specified for a single name in the same scope, that name is said to be overloaded
Because of that, I'd not use the term overloaded here.
This kind of function definition defines a single function but 2 additional calling syntaxes. The subtle difference becomes apparent when taking function pointers or matching a template function argument to overloaded functions: in that case you only have a function with full argument list as the available overloaded type.
Now the tricky thing is that we are talking about a constructor here, and a constructor does not engage in the same kind of overloading resolution as an ordinary function and is, for all purposes, not accessible other than syntactically. In particular, this definition does count separately as a default constructor. It also counts separately as a converting constructor from int and can be used as ((Fraction)3).
So for all practical purposes, it creates three different syntactic entities in the constructor category. And as opposed to ordinary functions, there is no functional context where overload resolution would expose the difference between three actual function signatures and three merely syntactical calling conventions.
This is not a good question for a written test. This is really something for an oral exam since there are so many subtleties involved that the difference between a formally correct answer (if any) and a formally wrong answer is not likely to correlate well with actual knowledge and skill, and the reasoning behind any answer is more important than the answer itself.
Because it depends on the arguments you pass:
Fraction() --> Fraction(0,1)
Fraction(n)---> Fraction(n,1)
Fraction(n,m)
So it gives 3 constructors. No overloading is taking place here.
You can create the Fraction object in three different ways using the single constructor declared int the above class. Constructor has default parameters. If you don't pass any argument, it assumes the respective value for the argument.
Fraction a;
// numerator will be 0 and denominator will be 1Fraction a(10);
// numerator will be 10 and denominator will be 1Fraction a(10, 20);
// numerator will be 10 and denominator will be 20
ReferenceURL : https://stackoverflow.com/questions/37846565/how-many-constructors-does-the-class-have
'IT story' 카테고리의 다른 글
CSS가있는 반원 (테두리, 윤곽선 만) (0) | 2020.12.25 |
---|---|
생성자 주입없이 서비스 인스턴스 얻기 (0) | 2020.12.25 |
Android의 Moshi 대 Gson (0) | 2020.12.25 |
'bool'은 C ++의 기본 데이터 유형입니까? (0) | 2020.12.25 |
asp.net mvc에서 날짜 시간 값을 URI 매개 변수로 어떻게 전달합니까? (0) | 2020.12.25 |