Namespaces
Variants

Classes

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
Templates
Miscellaneous

클래스는 사용자 정의 타입입니다.

클래스 타입은 클래스 지정자(class-specifier)에 의해 정의되며, 이는 decl-specifier-seq 에서 선언 구문 내에 나타납니다. 클래스 지정자의 구문에 대해서는 클래스 선언 을 참조하십시오.

클래스는 다음과 같은 종류의 멤버를 가질 수 있습니다:

1) 데이터 멤버:
2) 멤버 함수:
3) 중첩 타입:
a) nested classes enumerations 가 클래스 정의 내부에 정의된 경우
b) 기존 타입의 별칭, typedef 또는 type alias (C++11부터) 선언으로 정의됨
c) 클래스의 이름은 자체 정의 내에서 (단, 생성자 를 지칭할 때를 제외하고) 조회 목적상 자체에 대한 공용 멤버 타입 별칭으로 작용합니다: 이를 injected-class-name (주입된 클래스 이름)이라고 합니다.
4) enumerators 클래스 내에서 정의된 모든 비범위 열거형의 열거자 , 또는 using-declarations 또는 using-enum-declarations 를 통해 도입된 열거자 (C++20부터)
5) 멤버 템플릿 ( 변수 템플릿, (C++14 이후) 클래스 템플릿 또는 함수 템플릿)은 비지역 클래스/구조체/공용체의 본문 내에 나타날 수 있습니다.

모든 멤버는 클래스 정의에서 한 번에 정의되며, 이미 정의된 클래스에 추가할 수 없습니다(네임스페이스의 멤버와 달리)

클래스 T 의 멤버는 해당 멤버가 다음과 같은 경우 T 를 이름으로 사용할 수 없습니다

  • 정적 데이터 멤버,
  • 멤버 함수,
  • 멤버 타입,
  • 멤버 템플릿,
  • 열거형의 열거자 (열거형이 scoped가 아닌 경우) (C++11부터) , 또는
  • 멤버 익명 공용체의 멤버.

그러나 사용자 선언 생성자가 없는 경우 비정적 데이터 멤버는 T 이름을 사용할 수 있습니다.

적어도 하나 이상의 선언되거나 상속된 virtual 멤버 함수를 가진 클래스는 다형적(polymorphic) 입니다. 이 타입의 객체는 다형적 객체(polymorphic objects) 이며, 객체 표현의 일부로 런타임 타입 정보를 저장합니다. 이 정보는 dynamic_cast typeid 를 사용하여 질의할 수 있습니다. 가상 멤버 함수는 동적 바인딩에 참여합니다.

적어도 하나 이상의 선언되거나 상속된 순수 가상 멤버 함수를 가진 클래스는 추상 클래스 입니다. 이 타입의 객체는 생성할 수 없습니다.

constexpr 생성자를 가진 클래스는 LiteralType 입니다: 이 타입의 객체들은 컴파일 시간에 constexpr 함수들에 의해 조작될 수 있습니다.

(since C++11)

목차

클래스의 속성

Trivially copyable class

Trivially copyable class 는 다음 조건을 만족하는 클래스입니다:

Trivial class

Trivial class 는 다음 조건을 만족하는 클래스입니다:

(C++26에서 사용 중단됨)

Standard-layout class

Standard-layout class 는 다음 조건을 만족하는 클래스입니다:

  • non-standard-layout 클래스 타입(또는 그러한 타입의 배열)이나 참조자인 non-static data members 가 없으며,
  • virtual functions virtual base classes 가 없으며,
  • 모든 non-static data members에 대해 동일한 access control 을 가지며,
  • non-standard-layout 기본 클래스가 없으며,
  • 계층 구조에서 오직 하나의 클래스만 non-static data members를 가지며,
  • 비공식적으로, 기본 클래스 중 어느 것도 첫 번째 non-static data member와 동일한 타입을 가지지 않습니다. 또는 공식적으로: 클래스를 S라고 할 때, M(S) 타입 집합의 어떤 요소도 기본 클래스로 가지고 있지 않습니다. 여기서 타입 X에 대한 M(X)는 다음과 같이 정의됩니다:
  • X가 (상속된 것을 포함하여) non-static data members가 없는 비-공용체 클래스 타입인 경우, M(X) 집합은 비어 있습니다.
  • X가 첫 번째 non-static data member의 타입이 X0인 비-공용체 클래스 타입인 경우(해당 멤버는 익명 공용체일 수 있음), M(X) 집합은 X0과 M(X0)의 요소들로 구성됩니다.
  • X가 공용체 타입인 경우, M(X) 집합은 모든 M(Ui)의 합집합과 모든 Ui를 포함하는 집합입니다. 여기서 각 Ui는 X의 i번째 non-static data member의 타입입니다.
  • X가 요소 타입 Xe를 가진 배열 타입인 경우, M(X) 집합은 Xe와 M(Xe)의 요소들로 구성됩니다.
  • X가 비-클래스, 비-배열 타입인 경우, M(X) 집합은 비어 있습니다.

Standard-layout struct 는 클래스 키워드 struct 또는 클래스 키워드 class 로 정의된 standard-layout 클래스입니다. Standard-layout union 은 클래스 키워드 union 로 정의된 standard-layout 클래스입니다.

(C++11부터)

암시적 수명 클래스

암시적 수명 클래스(implicit-lifetime class) 는 다음과 같은 클래스입니다

  • 다음 중 하나인 경우: aggregate 이며 소멸자가 사용자 선언되지 않은 (C++11 이전) 사용자 제공되지 않은 (C++11 이후) 경우, 또는
  • 최소한 하나의 trivial eligible constructor와 trivial하며 삭제되지 않은 소멸자를 가진 경우.

참고: 암시적 수명 속성은 결함 보고서 P0593R6 에 의해 명확히 정의되었습니다.

POD 클래스

POD 클래스 는 다음 조건을 만족하는 클래스입니다

  • aggregate 이고,
  • 사용자 선언 복사 할당 연산자가 없고,
  • 사용자 선언 소멸자가 없고,
  • 비-POD 클래스 타입(또는 해당 타입의 배열)이나 참조자를 비정적 데이터 멤버로 가지지 않는 클래스입니다.
(C++11까지)
  • trivial 클래스이고,
  • standard-layout 클래스이며,
  • 비-POD 클래스 타입(또는 해당 타입의 배열)을 비정적 데이터 멤버로 가지지 않는 클래스입니다.
(C++11부터)

POD 구조체 는 비-union POD 클래스입니다. POD union 은 POD 클래스인 union입니다.

(C++20에서 사용 중단됨)

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 수정된 동작
CWG 148 C++98 POD 클래스가 자신도 POD(스칼라) 타입인 멤버 포인터를
포함할 수 없었음
제한 사항 제거됨
CWG 383 C++98 복사 할당 연산자나 소멸자가 정의되지 않은 경우
POD 클래스에서 사용자 선언이 가능했음
허용되지 않음
CWG 1363 C++11 trivial 기본 생성자와 non-trivial 기본 생성자를 동시에
가지는 클래스가 trivial일 수 있었음
non-trivial로 처리됨
CWG 1496 C++11 모든 생성자가 삭제된 것으로 정의된 클래스가
trivial일 수 있었음
non-trivial로 처리됨
CWG 1672 C++11 여러 개의 빈 기본 클래스를 가지는 클래스가
standard-layout 클래스일 수 있었음
standard-layout 클래스가 아님
CWG 1734 C++11 trivially copyable 클래스가 non-trivial 삭제된
복사/이동 생성자/할당 연산자를 가질 수 없었음
삭제된 경우 trivial일 수 있음
CWG 1813 C++11 비정적 데이터 멤버를 상속하는 기본 클래스를 가지는
클래스는 standard-layout 클래스가 될 수 없었음
standard-layout 클래스가 될 수 있음
CWG 1881 C++11 standard-layout 클래스와 그 기본 클래스들에 대해,
이름 없는 비트 필드가 데이터 멤버를 선언하는
다른 클래스에서 선언될 수 있었음
모든 비정적 데이터 멤버와 비트 필드는
동일한 클래스에서 먼저
선언되어야 함
CWG 1909 C++98 멤버 템플릿이 자신의 클래스와 동일한 이름을 가질 수 있었음 금지됨
CWG 2120 C++11 standard-layout 클래스 결정 시 M(X) 정의에서
첫 번째 멤버가 배열인 클래스의 경우를
고려하지 않았음
M(X) 정의에서 이 경우를
처리하도록 수정됨
CWG 2605 C++98 implicit-lifetime 클래스가 사용자 제공 소멸자를 가질 수 있었음 금지됨