Namespaces
Variants

Default constructors

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Default constructor
Copy constructor
Move constructor (C++11)
Templates
Miscellaneous

기본 생성자는 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

설명

1) 클래스 정의 내부에서 기본 생성자 선언.
2-4) 클래스 정의 내부에서 기본 생성자 정의.
3) 기본 생성자가 명시적으로 기본 설정되었습니다.
4) 기본 생성자가 삭제되었습니다.
5,6) 클래스 정의 외부에서 기본 생성자 정의 (클래스는 선언을 포함해야 함 (1) ).
6) 기본 생성자가 명시적으로 기본 설정되었습니다.

기본 생성자는 기본 초기화 값 초기화 과정에서 호출됩니다.

암시적으로 선언된 기본 생성자

클래스 타입에 대해 사용자가 선언한 생성자나 생성자 템플릿이 없는 경우, 컴파일러는 해당 클래스의 inline public 멤버로 기본 생성자를 암시적으로 선언합니다.

암묵적으로 선언된(또는 첫 선언에서 기본 설정된) 기본 생성자는 다음과 같이 설명된 예외 사양을 가집니다. 동적 예외 사양 (C++17까지) noexcept 사양 (C++17부터) .

암시적으로 정의된 기본 생성자

만약 생성자가 암시적으로 선언된 경우 (C++11 이전) 암시적으로 선언되거나 명시적으로 기본값으로 설정된 기본 생성자가 삭제된 것으로 정의되지 않은 경우 (C++11 이후) , 이는 컴파일러에 의해 odr-used 되거나 상수 평가에 필요한 경우 또는 첫 번째 선언 이후 명시적으로 기본값으로 설정된 경우 (C++11 이후) 에 암시적으로 정의됩니다.

유니온과 유사한 클래스 union-like class T 의 기본 생성자가 trivial한 경우, T 이거나 T 의 익명 유니온 멤버인 각 유니온 U 에 대해, U 의 첫 번째 variant 멤버(있는 경우)가 implicit-lifetime type 을 가지면, T 의 기본 생성자는 해당 멤버가 자신의 유니온의 active 멤버가 아닌 경우 그 멤버의 수명을 시작합니다.

(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)


삭제된 기본 생성자

다음 조건 중 하나라도 만족할 경우, 클래스 T 에 대해 암시적으로 선언되거나 명시적으로 기본 설정된 기본 생성자는 삭제된 것으로 정의됩니다:

  • T 가 기본 초기화자를 갖지 않는 참조 타입의 비정적 데이터 멤버를 가지고 있는 경우
  • T 가 비- union 클래스이고 (C++26부터) 기본 멤버 초기화자를 갖지 않는 const 한정 타입(또는 다차원 배열)의 비볼트 비정적 비- const-default-constructible 데이터 멤버를 가지고 있는 경우
  • T union 이고 모든 variant 멤버가 const 한정 타입(또는 다차원 배열)인 경우
  • T 가 비-union 클래스이고 모든 익명 union 멤버의 모든 멤버가 const 한정 타입(또는 다차원 배열)인 경우
(C++26 이전)
  • M 이 삭제되었거나 기본 생성자에서 접근할 수 없는 소멸자를 가지고 있고 , obj 가 비볼트이거나 obj 가 기본 멤버 초기화자를 가지고 있는 경우 (C++26부터) .
  • 다음 모든 조건이 만족되는 경우:
  • obj 가 기본 초기화자를 가진 비정적 데이터 멤버가 아닌 경우
  • obj 가 variant 멤버가 아니거나 다른 비정적 데이터 멤버가 기본 초기화자를 가진 union의 variant 멤버가 아닌 경우 (C++26 이전) .
  • M 의 기본 생성자를 찾기 위한 오버로드 해결이 사용 가능한 후보를 결과로 내지 않거나 obj 가 variant 멤버인 경우 비트리비얼 함수를 선택하는 경우 (C++26 이전) .

사용자 정의 생성자가 없고 암시적으로 선언된 기본 생성자가 트리비얼하지 않은 경우, 사용자는 delete 키워드를 사용하여 컴파일러에 의한 암시적으로 정의된 기본 생성자의 자동 생성을 억제할 수 있습니다.

(C++11부터)

기본 생성자(Trivial default constructor)

클래스 T 의 기본 생성자는 다음 조건들을 모두 만족할 경우 trivial합니다:

  • 생성자는 암시적으로 선언됨 (C++11 이전) user-provided가 아님 user-provided (C++11 이후) .
  • T 에 가상 멤버 함수가 없음.
  • T 에 가상 기반 클래스가 없음.
  • T 에는 기본 초기화자를 가진 비정적 멤버가 없습니다.
(C++11부터)
  • T 의 모든 직접 기반 클래스는 trivial 기본 생성자를 가집니다.
  • 클래스 타입(또는 그 배열)의 모든 비정적 멤버가 trivial default constructor를 가짐
(C++26까지)
  • T 가 union이거나, 클래스 타입(또는 그 배열)의 모든 비variant 비정적 멤버가 trivial default constructor를 가짐
(C++26부터)

사소한 기본 생성자는 아무런 동작도 수행하지 않는 생성자입니다. C 언어와 호환되는 모든 데이터 타입(POD 타입)은 사소하게 기본 생성 가능합니다.

적격 기본 생성자

기본 생성자는 사용자 선언되었거나 암시적으로 선언되고 정의 가능한 경우 적격입니다.

(until C++11)

기본 생성자는 삭제되지 않은 경우 적격입니다.

(since C++11)
(until C++20)

기본 생성자는 다음 조건을 모두 만족하는 경우 적격입니다:

  • 삭제되지 않아야 합니다.
  • 해당 associated constraints (있는 경우)가 만족되어야 합니다.
  • associated constraints가 만족되는 더 more constrained 기본 생성자가 없어야 합니다.
(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 사용자 선언 생성자 템플릿이 존재하는 경우에도
기본 생성자가 암시적으로 선언됨
이 경우 암시적 선언
없음

참고 항목