Default constructors
기본 생성자는 constructor 인수가 없이 호출될 수 있는 생성자입니다.
목차 |
구문
class-name
(
parameter-list
(선택 사항)
);
|
(1) | ||||||||
class-name
(
parameter-list
(선택 사항)
)
function-body
|
(2) | ||||||||
class-name
() = default;
|
(3) | (C++11 이후) | |||||||
class-name
(
parameter-list
(선택 사항)
) = delete;
|
(4) | (C++11 이후) | |||||||
class-name
::
class-name
(
parameter-list
(선택 사항)
)
function-body
|
(5) | ||||||||
class-name
::
class-name
() = default;
|
(6) | (C++11 이후) | |||||||
| class-name | - | 기본 생성자가 선언되는 클래스 |
| parameter-list | - | 모든 매개변수가 ( parameter packs 제외 ) (C++11부터) default arguments 를 가지는 parameter list |
| function-body | - | 기본 생성자의 function body |
설명
기본 생성자는 기본 초기화 와 값 초기화 과정에서 호출됩니다.
암시적으로 선언된 기본 생성자
클래스 타입에 대해 사용자가 선언한 생성자나 생성자 템플릿이 없는 경우, 컴파일러는 해당 클래스의 inline public 멤버로 기본 생성자를 암시적으로 선언합니다.
암묵적으로 선언된(또는 첫 선언에서 기본 설정된) 기본 생성자는 다음과 같이 설명된 예외 사양을 가집니다. 동적 예외 사양 (C++17까지) noexcept 사양 (C++17부터) .
암시적으로 정의된 기본 생성자
만약 생성자가 암시적으로 선언된 경우 (C++11 이전) 암시적으로 선언되거나 명시적으로 기본값으로 설정된 기본 생성자가 삭제된 것으로 정의되지 않은 경우 (C++11 이후) , 이는 컴파일러에 의해 odr-used 되거나 상수 평가에 필요한 경우 또는 첫 번째 선언 이후 명시적으로 기본값으로 설정된 경우 (C++11 이후) 에 암시적으로 정의됩니다.
|
유니온과 유사한 클래스
union-like class
|
(since C++26) |
An (until C++26) Otherwise, an (since C++26) 암시적으로 정의된 기본 생성자는 빈 본문과 빈 초기화 목록을 가진 사용자 정의 생성자와 동일한 효과를 가집니다. 즉, 이 클래스의 기본 클래스들과 비정적 멤버들의 기본 생성자들을 호출합니다. 빈 사용자 제공 생성자를 가진 클래스 타입들은 값 초기화 동안 암시적으로 정의된 기본 생성자를 가진 것들과 다르게 취급될 수 있습니다.
|
이것이 constexpr constructor (until C++23) constexpr function (since C++23) 의 요구사항을 만족할 경우, 생성된 생성자는 constexpr 입니다. 일부 사용자 정의 생성자가 존재하는 경우, 사용자는 default 키워드를 사용하여 암시적으로 선언되었을 컴파일러의 기본 생성자 자동 생성을 강제할 수 있습니다. |
(since C++11) |
삭제된 기본 생성자
다음 조건 중 하나라도 만족할 경우, 클래스
사용자 정의 생성자가 없고 암시적으로 선언된 기본 생성자가 트리비얼하지 않은 경우, 사용자는 delete 키워드를 사용하여 컴파일러에 의한 암시적으로 정의된 기본 생성자의 자동 생성을 억제할 수 있습니다. |
(C++11부터) |
기본 생성자(Trivial default constructor)
클래스
T
의 기본 생성자는 다음 조건들을 모두 만족할 경우 trivial합니다:
- 생성자는 암시적으로 선언됨 (C++11 이전) user-provided가 아님 user-provided (C++11 이후) .
-
T에 가상 멤버 함수가 없음. -
T에 가상 기반 클래스가 없음.
|
(C++11부터) |
-
T의 모든 직접 기반 클래스는 trivial 기본 생성자를 가집니다.
|
(C++26까지) |
|
(C++26부터) |
사소한 기본 생성자는 아무런 동작도 수행하지 않는 생성자입니다. C 언어와 호환되는 모든 데이터 타입(POD 타입)은 사소하게 기본 생성 가능합니다.
적격 기본 생성자
|
기본 생성자는 사용자 선언되었거나 암시적으로 선언되고 정의 가능한 경우 적격입니다. |
(until C++11) |
|
기본 생성자는 삭제되지 않은 경우 적격입니다. |
(since C++11)
(until C++20) |
|
기본 생성자는 다음 조건을 모두 만족하는 경우 적격입니다:
|
(since C++20) |
적격 기본 생성자의 triviality는 클래스가 implicit-lifetime type 인지 여부와 클래스가 trivially copyable type 인지 여부를 결정합니다.
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_trivial_union
|
202502L
|
(C++26) | union의 특수 멤버 함수에 대한 triviality 요구사항 완화 |
예제
struct A { int x; A(int x = 1): x(x) {} // 사용자 정의 기본 생성자 }; struct B : A { // B::B()는 암시적으로 정의됨, A::A() 호출 }; struct C { A a; // C::C()는 암시적으로 정의됨, A::A() 호출 }; struct D : A { D(int y) : A(y) {} // 다른 생성자가 존재하므로 D::D()는 선언되지 않음 }; struct E : A { E(int y) : A(y) {} E() = default; // 명시적으로 기본값 지정, A::A() 호출 }; struct F { int& ref; // 참조 멤버 const int c; // const 멤버 // F::F()는 암시적으로 삭제됨으로 정의됨 }; // 사용자 선언 복사 생성자(사용자 제공, 삭제 또는 기본값 지정)는 // 기본 생성자의 암시적 생성을 방지함 struct G { G(const G&) {} // G::G()는 암시적으로 삭제됨으로 정의됨 }; struct H { H(const H&) = delete; // H::H()는 암시적으로 삭제됨으로 정의됨 }; struct I { I(const I&) = default; // I::I()는 암시적으로 삭제됨으로 정의됨 }; int main() { A a; B b; C c; // D d; // 컴파일 오류 E e; // F f; // 컴파일 오류 // G g; // 컴파일 오류 // H h; // 컴파일 오류 // I i; // 컴파일 오류 }
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 1353 | C++11 |
암시적으로 선언된 기본 생성자가 삭제된 것으로
정의되는 조건에서 다차원 배열 타입을 고려하지 않음 |
이러한 타입들을 고려함 |
| CWG 2084 | C++11 |
기본 멤버 초기화자가 union의 기본 설정된 기본 생성자가
삭제되는지 여부에 영향을 주지 않음 |
기본 설정된 기본 생성자가
삭제되는 것을 방지함 |
| CWG 2595 | C++20 |
더 제약된 다른 기본 생성자가 존재하지만 해당 연관 제약 조건을
만족하지 않는 경우 기본 생성자가 적격하지 않음 |
이 경우 적격할 수 있음 |
| CWG 2871 | C++98 |
사용자 선언 생성자 템플릿이 존재하는 경우에도
기본 생성자가 암시적으로 선언됨 |
이 경우 암시적 선언
없음 |