기본 생성자

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에서는 그렇지 않습니다.

레퍼런스

  1. ^ C++ 표준, ISO/IEC 14882:1998, 12.1.5
    C++ 표준, ISO/IEC 14882:2003, 12.1.5
  2. ^ 컴퓨터 과학 Behrouz A의 C++를 사용한 구조화된 접근법.포우잔과 리처드 F.길버그
  3. ^ 컴퓨터 과학 Behrouz A의 C++를 사용한 구조화된 접근법.포우잔과 리처드 F.길버그
  4. ^ Java Language Specification, 제3판, 섹션 8.8.9, "기본 컨스트럭터"
  5. ^ 컨스트럭터 사용(C# 프로그래밍 가이드)