Classes
클래스는 사용자 정의 타입입니다.
클래스 타입은 클래스 지정자(class-specifier)에 의해 정의되며, 이는 decl-specifier-seq 에서 선언 구문 내에 나타납니다. 클래스 지정자의 구문에 대해서는 클래스 선언 을 참조하십시오.
클래스는 다음과 같은 종류의 멤버를 가질 수 있습니다:
모든 멤버는 클래스 정의에서 한 번에 정의되며, 이미 정의된 클래스에 추가할 수 없습니다(네임스페이스의 멤버와 달리)
클래스
T
의 멤버는 해당 멤버가 다음과 같은 경우
T
를 이름으로 사용할 수 없습니다
- 정적 데이터 멤버,
- 멤버 함수,
- 멤버 타입,
- 멤버 템플릿,
- 열거형의 열거자 (열거형이 scoped가 아닌 경우) (C++11부터) , 또는
- 멤버 익명 공용체의 멤버.
그러나 사용자 선언 생성자가 없는 경우 비정적 데이터 멤버는
T
이름을 사용할 수 있습니다.
적어도 하나 이상의 선언되거나 상속된
virtual
멤버 함수를 가진 클래스는
다형적(polymorphic)
입니다. 이 타입의 객체는
다형적 객체(polymorphic objects)
이며, 객체 표현의 일부로 런타임 타입 정보를 저장합니다. 이 정보는
dynamic_cast
와
typeid
를 사용하여 질의할 수 있습니다. 가상 멤버 함수는 동적 바인딩에 참여합니다.
적어도 하나 이상의 선언되거나 상속된 순수 가상 멤버 함수를 가진 클래스는 추상 클래스 입니다. 이 타입의 객체는 생성할 수 없습니다.
|
constexpr 생성자를 가진 클래스는 LiteralType 입니다: 이 타입의 객체들은 컴파일 시간에 constexpr 함수들에 의해 조작될 수 있습니다. |
(since C++11) |
목차 |
클래스의 속성
Trivially copyable classTrivially copyable class 는 다음 조건을 만족하는 클래스입니다:
Standard-layout classStandard-layout class 는 다음 조건을 만족하는 클래스입니다:
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 클래스 는 다음 조건을 만족하는 클래스입니다
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 클래스가 사용자 제공 소멸자를 가질 수 있었음 | 금지됨 |