기본 생성자
Default constructor컴퓨터 프로그래밍 언어에서 디폴트 컨스트럭터라는 용어는 프로그래머 정의 컨스트럭터가 없을 때 컴파일러에 의해 자동으로 생성되는 컨스트럭터(예를 들어 자바)를 나타낼 수 있으며, 보통 nullary 컨스트럭터이다.다른 언어(예: C++)에서는 컨스트럭터가 자동 생성인지 사용자 정의인지에 관계없이 인수를 제공하지 않고 호출할 수 있는 컨스트럭터입니다.생성자의 정의에 기본 인수가 제공된 경우 형식 매개 변수를 사용하여 생성자를 여전히 인수 없이 호출할 수 있습니다.
C++
C++에서 표준은 클래스의 기본 생성자를 인수 없이 호출할 수 있는 생성자로 기술합니다(이것은 파라미터가 모두 기본 [1]인수를 갖는 생성자를 포함합니다).예를 들어 다음과 같습니다.
학급 마이클래스 { 일반의: 마이클래스(); // 생성자가 선언됨 사적인: 인트 x; }; 마이클래스::마이클래스() : x(100) // 생성자가 정의됨 { } 인트 주된() { 마이클래스 m; // 런타임에 객체 m이 생성되고 기본 생성자가 호출됩니다. }
메모리를 동적으로 할당할 경우 클래스 이름 뒤에 괄호를 추가하여 생성자를 호출할 수 있습니다.어떤 의미에서 이것은 컨스트럭터에 대한 명시적인 호출입니다.
인트 주된() { 마이클래스 * 포인터 = 신규 마이클래스(); // 런타임에 오브젝트가 생성되고 // 기본 생성자가 호출됩니다. }
생성자에 하나 이상의 매개 변수가 있지만 모두 기본값을 가진 경우 생성자는 여전히 기본 생성자입니다.각 클래스에는 다음과 같이 파라미터가 없는 디폴트컨스트럭터 또는 모든 파라미터에 디폴트값이 설정되어 있는 디폴트컨스트럭터를 1개까지 설정할 수 있습니다.
학급 마이클래스 { 일반의: 마이클래스 (인트 i = 0, 표준::스트링 s = ""); // 생성자가 선언됨 사적인: 인트 x; 인트 y; 표준::스트링 z; }; 마이클래스::마이클래스(인트 i, 표준::스트링 s) // 생성자가 정의됨 { x = 100; y = i; z = s; }
C++에서는 디폴트컨스트럭터는 특정 상황에서 자동으로 호출되기 때문에 중요합니다.따라서 이러한 상황에서는 클래스에 디폴트컨스트럭터가 없는 것은 에러입니다.
- 객체 값이 인수 목록 없이 선언된 경우(예:
MyClass x;
또는 인수 목록 없이 동적으로 할당됩니다(예:new MyClass;
또는new MyClass();
디폴트 컨스트럭터)MyClass
는 오브젝트를 초기화하기 위해 사용됩니다. - 객체 배열이 선언된 경우(예:
MyClass x[10];
; 또는 동적으로 할당됩니다.new MyClass [10]
. 디폴트 컨스트럭터MyClass
모든 요소를 초기화하기 위해 사용됩니다. - 파생 클래스 생성자가 이니셜라이저 목록에서 기본 클래스 생성자를 명시적으로 호출하지 않으면 기본 클래스의 기본 생성자가 호출됩니다.
- 클래스 생성자가 이니셜라이저 목록에서 개체 값 필드 중 하나의 생성자를 명시적으로 호출하지 않으면 필드 클래스의 기본 생성자가 호출됩니다.
- 표준 라이브러리에서 특정 컨테이너는 값이 명시적으로 지정되지 않은 경우 기본 생성자를 사용하여 값을 "채웁니다".예.
vector<MyClass>(10);
10개의 요소로 벡터를 초기화합니다.이 요소들은 기본값으로 채워집니다.MyClass
물건.
클래스에 명시적으로 정의된 생성자가 없는 경우 컴파일러는 암시적으로 기본 생성자를 선언하고 정의합니다.이 암묵적으로 정의된 기본 생성자는 본문이 비어 있는 명시적으로 정의된 생성자와 동일합니다.예를 [2]들어 다음과 같습니다.
학급 마이클래스 { 인트 x; // 생성자가 없으므로 컴파일러는 기본 생성자를 생성합니다. }; 인트 주된() { 마이클래스 m; // 런타임에 오류가 없음: (실행) 기본 생성자가 호출됩니다. }
생성자가 클래스에 대해 명시적으로 정의되어 있지만 모두 기본이 아닌 경우 컴파일러는 기본 생성자를 암묵적으로 정의하지 않으므로 클래스에 기본 생성자가 없는 상황이 발생합니다.이것이 일반적인 에러의 원인입니다.다음의 예를 참조해 주세요.
학급 마이클래스 { 일반의: 마이클래스 (인트 y); // 기본이 아닌 생성자를 선언합니다. 사적인: 인트 x; }; 마이클래스::마이클래스 (인트 y) { x = y; } 인트 주된() { 마이클래스 m(100); // 기본이 아닌 생성자가 호출됩니다. 마이클래스 * p; // 포인터 선언의 경우 컴파일러는 생성자에 대해 알 필요가 없습니다. p = 신규 마이클래스(); // 컴파일 시 오류: 기본 생성자가 없습니다. 돌아가다 0; }
프로그래머와 컴파일러 모두 기본 생성자를 정의하지 않았기 때문에, 반대되는 생성자는 다음과 같이 지적됩니다.p
에러가 발생합니다.[3]
한편 C++11에서는 디폴트컨스트럭터를 명시적으로 작성할 수 있습니다.
학급 마이클래스 { 일반의: 마이클래스 () = 체납; // 기본 생성자 강제 생성 };
또는 명시적으로 금지됨:
학급 마이클래스 { 일반의: 마이클래스 () = 삭제하다; // 기본 생성자 생성 금지 };
Java 및 C#
Java와 C# 모두에서 "기본 생성자"는 클래스에 대해 정의된 생성자가 없는 경우 컴파일러에 의해 자동으로 생성되는 늘 생성자를 말합니다.기본 생성자는 암시적으로 슈퍼클래스의 Null 생성자를 호출한 다음 빈 본문을 실행합니다.모든 필드는 초기값 0(정수형), 0.0(부동소수점형),false
(boolean
타입) 또는null
(참조 유형).매개 변수를 사용하지 않는 프로그래머 정의 생성자를 [4][5]C#에서는 기본 생성자라고 부르지만 Java에서는 그렇지 않습니다.
레퍼런스
- ^ C++ 표준, ISO/IEC 14882:1998, 12.1.5
C++ 표준, ISO/IEC 14882:2003, 12.1.5 - ^ 컴퓨터 과학 Behrouz A의 C++를 사용한 구조화된 접근법.포우잔과 리처드 F.길버그
- ^ 컴퓨터 과학 Behrouz A의 C++를 사용한 구조화된 접근법.포우잔과 리처드 F.길버그
- ^ Java Language Specification, 제3판, 섹션 8.8.9, "기본 컨스트럭터"
- ^ 컨스트럭터 사용(C# 프로그래밍 가이드)