C + + 형식 시스템 (현대 C++)

개념 유형 c + +에서이 매우 중요 합니다.모든 변수, 함수 인수 및 함수 반환 값 형식을 컴파일할 수 있어야 합니다.계산 되기 전에 또한, 리터럴 값 등 모든 식은 암시적으로 형식은 컴파일러에 의해 부여 됩니다.일부의 유형 포함 int 정수 계열 값을 저장할 수 double 부동 소수점 값을 저장 하 (라고도 스칼라 데이터 형식), 또는 표준 라이브러리 클래스 std::basic_string 텍스트를 저장 합니다.정의 하 여 형식을 직접 만들 수 있는 class 또는 struct.형식 변수 (또는 식 결과 대 한), 종류 변수 값 (비트 패턴)로 해석 하는 방법을,에서 수행할 수 있는 작업에는 저장 된 값에 할당 된 메모리의 양을 지정 합니다.비공식적인 c + + 형식 시스템의 주요 기능을 간략하게를 나와 있습니다.

용어

변수:는 기호화 된 이름 데이터 양을 참조 하 정의 위치 코드의 범위 전체에 걸쳐 데이터에 액세스할 수 있는 이름을 사용할 수 있도록 합니다.다른 형식의 인스턴스는 일반적으로 "개체" 라고 하는 반면 c + +에서는 "변수" 일반적으로 스칼라 데이터 형식의 인스턴스를 참조할 수 있습니다.

개체: 단순 성과 일관성에 대 한이 문서의 "개체" 라는 용어를 사용 하 여 클래스 또는 구조체의 인스턴스를 참조 하 고 일반적으로 사용 될 때 모든 형식을 포함도 스칼라 변수입니다.

POD 형식은 (일반 이전 데이터):이 비공식적인 c + +에서 데이터 형식 범주는 스칼라 형식을 참조할 (기본 형식 섹션 참조) 또는 포드 클래스.포드 클래스, 포드도 없는 정적 데이터 멤버가 있고 없음 사용자 정의 생성자, 소멸자, 사용자 정의 또는 사용자 정의 할당 연산자.또한 포드 클래스에 가상 함수가 없는, 없는 기본 클래스 및 전용 또는 보호 된 비정적 데이터 멤버가 있습니다.POD 형식은 주로 외부 데이터 교환에 대 한 예를 들어 POD 형식만 있는 C 언어로 작성 된 모듈 사용 됩니다.

변수 및 함수는 형식을 지정합니다.

C + +는 강력한 언어 되며 또한 정적 형식의. 모든 개체 형식에 하 고는 절대로 (정적 데이터 개체와 혼동 되지 않도록) 변경 내용을 입력 합니다.
변수를 선언할 때 코드에서 해당 형식을 명시적으로 지정 하거나 사용 하는 auto 키워드 형식 이니셜라이저에서 추론 하도록 컴파일러에 지시 합니다.
함수를 선언할 때 코드에서 각 인수 및 반환 값의 형식을 지정 해야 하거나 void 값이 없는 함수에 의해 반환 되는 경우.임의 형식의 인수를 허용 하는 함수 템플릿을 사용 하는 경우는 예외가입니다.

먼저 변수를 선언 하면 해당 형식을 나중에 변경할 수 없습니다.그러나 다른 형식의 변수에 다른 변수 값 또는 함수 반환 값을 복사할 수 있습니다.이러한 작업 이라고 형식 변환, 필요한 있는 경우도 있지만 데이터 손실이 나 불완전성의 잠재적 공급처 이기도 합니다.

POD 형식의 변수를 선언 하는 경우, 즉 초기 값 부여할 초기화 좋습니다.변수 초기화 될 때까지 해당 메모리 위치에 앞으로 어떤 비트를 발생의 구성 "가비지" 값이 있습니다.중요 한 부분은 기억 하기, c + +가 특히 초기화를 처리 하는 다른 언어의 출처는 경우.비 포드 클래스 형식의 변수를 선언할 때 초기화 생성자를 처리 합니다.

다음 예제에서는 각에 대 한 설명으로 몇 가지 간단한 변수 선언을 보여 줍니다.또한 컴파일러 형식 정보를 사용 하 여 특정 변수를 후속 작업을 허용 하거나 거부 하려면 어떻게 보여 줍니다.

    int result = 0;              // Declare and initialize an integer.
    double coefficient = 10.8;   // Declare and initialize a floating 
                                 // point value.
    auto name = "Lady G.";       // Declare a variable and let compiler 
                                 // deduce the type.
    auto address;                // error. Compiler cannot deduce a type 
                                 // without an intializing value.
    age = 12;                    // error. Variable declaration must
                                 // specify a type or use auto!
    result = "Kenny G.";         // error. Can’t assign text to an int.
    string result = "zero";      // error. Can’t redefine a variable with
                                 // new type.
    int maxValue;                // Not recommended! maxValue contains 
                                 // garbage bits until it is initialized.

기본 (기본 제공) 형식

일부 언어와 달리 c + +는 다른 모든 형식에서 파생 된 범용 기본 형식이 없습니다.Visual C++ 언어 구현의 대부분 포함 되어 있습니다 기본 형식라고도 하며, 기본 제공 형식.숫자 형식으로 여기에 int, double, long, bool, 더한 char 및 wchar_t ASCII 및 유니코드 문자를 각각 입력 합니다.가장 기본적인 형식 (제외 하 고 bool, double, wchar_t 및 관련 형식) 모든 변수를 저장할 수 있는 값의 범위를 수정 하는 버전 서명 했습니다.예를 들어,는 int, 32 비트 부호 있는 정수를 저장 하는 나타낼 수 있습니다 값-2147483648에서 2147483647을 합니다.unsigned int, 32 비트로 저장도 되는 0에서 4294967295 값 저장할 수 있습니다.총 각 경우에 가능한 값은 같습니다. 범위에만 다릅니다.

기본 형식 및 다른 기본 형식으로 변환할 수는 방법에 수행할 수 있는 작업을 제어 하는 기본 제공 규칙에는 컴파일러에 의해 인식 됩니다.기본 제공 형식 및 크기와 숫자 제한에 대 한 전체 목록을 참조 하십시오 기본 형식 (C++).

다음 그림에서는 기본 제공 형식의 상대적 크기를 보여 줍니다.

기본 제공 형식의 크기(바이트)

다음 표에 가장 자주 기본 형식 사용:

형식

크기

주석

int

4바이트

정수 계열 값에 대 한 기본 선택입니다.

double

8바이트

부동 소수점 값에 대 한 기본 선택입니다.

bool

1바이트

True 또는 false가 될 수 있는 값을 나타냅니다.

char

1바이트

이전 C 스타일 문자열이 나 없는 유니코드로 변환 하는 std::string 개체에 대 한 ASCII 문자를 사용 합니다.

wchar_t

2바이트

(U t F-16 Windows 다른 운영 체제에서 다를 수 있습니다) 유니코드 형식으로 인코딩되어 있을 수 있는 "와이드" 값을 나타냅니다.이 형식 문자열에서 사용 되는 문자 형식 std::wstring.

unsigned char

1바이트

C + +가 없는 기본 제공 byte 형식입니다.바이트 값을 나타내는 부호 없는 문자를 사용 합니다.

unsigned int

4바이트

비트 플래그에 대 한 기본 선택입니다.

long long

8바이트

매우 큰 정수 값을 나타냅니다.

Void 형식

void 형식인 특수 유형입니다. 형식의 변수를 선언할 수 없습니다 void, 하지만 형식의 변수를 선언할 수 있습니다 void * (포인터를 void)에 때때로 필요한 원시 (형식화 되지 않은) 메모리를 할당 하는 경우.그러나 포인터를 void 형식 안전 및 일반적으로 사용 하는 최신 c + +에서 권장 합니다.함수 선언에 void 반환 값 즉, 함수 값; 작동 하지 않는다 일반적이 고 적절 한 활용이 void.선언 하는 데 필요한 매개 변수가 없는 C 언어 필요한 함수는 void 예를 들어, 매개 변수 목록에서 fou(void),이 이렇게 최신 c + +에서 권장 되지 않습니다와 선언 해야 fou().자세한 내용은 형식 변환 및 형식 안전성 (현대 C++)을 참조하십시오.

const 형식 한정자입니다.

모든 기본 제공 또는 사용자 정의 형식의 const 키워드로 정규화 될 수 있습니다.또한 멤버 함수 수 있습니다 const-자격이 있고도 const-오버 로드 합니다.값은 const 형식 초기화 된 후 수정할 수 없습니다.

    const double PI = 3.1415;
    PI = .75 //Error. Cannot modify const variable.

const 한정자 함수 및 변수 선언에서 광범위 하 게 사용 되며 "const 정확성"는 중요 한 개념은 c + +. 기본적으로 사용 하도록 의미 const , 컴파일 타임에 값 실수로 수정 되지 않습니다 보장 합니다.자세한 내용은 const (C++)을 참조하십시오.

A const 유형은는 비상수 버전. 예를 들어, const int 의 고유한 형식인 int.C + +를 사용할 수 있습니다 const_cast 연산자를 제거 해야 이러한 가끔 const 변수에서.자세한 내용은 형식 변환 및 형식 안전성 (현대 C++)을 참조하십시오.

문자열 형식

엄밀히 말하자면 c + + 언어에 기본 제공 "문자열" 형식이 없습니다. char및 wchar_t 단일 문자를 저장, 종료 null 값 추가 문자열에 맞게 이러한 형식의 배열을 선언 해야 (예를 들어, ASCII ‘\0’) 배열 요소 하나 지난 마지막 올바른 문자 ("C 스타일 문자열" 라고도 함).C 스타일 문자열 외부 문자열 유틸리티 라이브러리 함수를 사용 하는 훨씬 더 많은 코드를 쓸 필요 합니다.하지만 최신 c + +의 표준 라이브러리 형식 놓았습니다 std::string (8 비트 char-입력 문자열) 또는 std::wstring (16 비트 wchar_t-입력 문자열).STL 컨테이너는 규격 c + + 빌드 환경에서 포함 된 표준 라이브러리의 일부 이므로 네이티브 문자열 형식으로 생각할 수 있습니다.간단 하 게 사용 하는 #include <string> 하려면 지시문 형식을 프로그램에 사용할 수 있는.(ATL 또는 MFC를 사용 하는 경우 CString 클래스도 사용할 수 있지만 c + + 표준의 일부가 아닙니다.) Null로 끝나는 배열 (앞에서 언급 한 C 스타일 문자열)을 사용 하는 최신 c + +에서 권장 되지 않습니다.문자열 형식을 사용 하는 최신 c + + 프로그램에서 결정 하는 방법 및 다양 한 형식 간에 변환 하는 방법에 대 한 자세한 내용은 문자열 및 텍스트 (현대 C++).

사용자 정의 형식

정의 하는 경우는 class, struct, union, 또는 enum, 기본 형식 처럼 나머지 코드 부분에서 해당 구문을 사용 합니다.알려진된 크기 메모리에 있으며 사용 방법에 대 한 특정 규칙을 컴파일 타임 검사, 프로그램의 수명 동안 런타임에 적용 합니다.기본적인 기본 제공 형식 및 사용자 정의 형식 간의 기본 차이점은 다음과 같습니다.

  • 컴파일러는 사용자 정의 형식의 기본 지식이 있습니다."정의 하는 컴파일 프로세스 동안 처음 만나면 해당 유형을 학습" 합니다.

  • 해당 형식에 어떤 작업을 수행할 수와 어떻게 다른 형식으로 (오버를 로드 하는)을 정의 하 여 변환 될 수 지정 적절 한 연산자 비멤버 함수 또는 클래스 멤버입니다.자세한 내용은 오버 로드을 참조하십시오.

  • 정적으로 될 필요가 없습니다 개체의 변경 내용을 입력 안 (규칙)을 입력 합니다.메커니즘을 통해 상속 및 다형성, 사용자 정의 형식 (클래스의 개체 인스턴스로 라고도 함)는 클래스의 선언 된 변수는 다른 종류 보다 실행 시 컴파일 타임에 있을 수 있습니다.자세한 내용은 파생된 클래스을 참조하십시오.

포인터 형식

계속 특별 선언 자를 사용 하 여 포인터 형식의 변수를 선언할 수 있도록 c + +는 C 언어의 가장 오래 된 버전에이 지 시대의 다시를 * (별표).포인터 형식 주소에 있는 실제 데이터 값이 저장 되는 메모리에 저장 합니다.최신 c + +에서는이를 이라고 원시 포인터, 및 특수 연산자를 통해 코드에서 액세스할 수 * (별표) 또는 -> (대시를 더-보다).이 라고 역참조를 사용 하 여 어떤 것에 따라 스칼라에 대 한 포인터 또는 개체의 멤버에 대 한 포인터 역참조 됩니다에.포인터 형식은 작업 긴 C 및 c + + 프로그램 개발의 가장 어려운 고 혼란 스러운 측면 중 하나 였습니다.일부 사실과 관행, 하지만 그가 더 이상 필수 (또는 권장) 최신 c + +의 경우 raw 포인터를 사용 하는 데 도움이 되는이 절을 설명 원시 포인터의 발전으로 인해 개체 소유권에 대 한 전혀 사용 하 여 스마트 포인터 (이 섹션의 끝에 자세히 설명).여전히 유용 하 고 안전한 개체 관찰에 대 한 원시 포인터를 사용 하는 것 그러나 개체 소유권에 대해 사용 해야 하는 경우 주의 하 고 소유 하 여 개체 생성 및 소멸 방법에 매우 신중 하 게 고려 되어야 합니다.

알아야 할 가장 먼저 원시 포인터 변수 역참조 되 면 포인터가 참조 하는 메모리 위치의 주소를 저장 하는 데 필요한 메모리만 할당 됩니다 선언 하는 것입니다.데이터 값에 대 한 메모리 할당 (라고도 저장소 백업) 아직 할당 되지 않습니다.즉, 원시 포인터 변수를 선언 하 여 메모리 주소 변수는 실제 데이터 변수 없습니다 만들고 있습니다.백업 저장소에 유효한 주소가 포함 되어 있는지 확인 발생 합니다 전에 포인터 변수를 역참조 동작 (일반적으로: 심각한 오류) 프로그램에 정의 되지 않았습니다.다음 예제에서는 이러한 종류의 오류를 보여 줍니다.

    int* pNumber;       // Declare a pointer-to-int variable.
    *pNumber = 10;      // error. Although this may compile, it is
                        // a serious error. We are dereferencing an
                        // uninitialized pointer variable with no
                        // allocated memory to point to.

이 예제에서는 포인터 형식이 실제 정수 데이터를 저장 하기 위해 할당 된 메모리 또는 올바른 메모리 주소를 할당 하지 않고도 역참조 합니다.다음 코드에서는 이러한 오류 해결:

    int number = 10;          // Declare and initialize a local integer
                              // variable for data backing store.
    int* pNumber = &number;   // Declare and initialize a local integer
                              // pointer variable to a valid memory
                              // address to that backing store.
...
    *pNumber = 41;            // Dereference and store a new value in 
                              // the memory pointed to by
                              // pNumber, the integer variable called
                              // “number”. Note “number” was changed, not
                              // “pNumber”.

수정 된 코드 예제에서는 로컬 스택 메모리 백업 만들려면 저장소 pNumber 를 가리킵니다.우리는 기본적인 형식 편의상 사용합니다.실제로 지원 저장소에 대 한 포인터는 이라는 메모리 영역에 동적으로 할당 되는 대부분의 경우가 사용자 정의 형식에 힙 (또는 "사용 가능한 저장소")를 사용 하 여는 new 키워드 식 (C 방식의 프로그래밍 이전 malloc() C 런타임 라이브러리 함수를 사용 했습니다).특히 이러한 클래스 정의를 기반으로 하는 경우 할당 되 면 이러한 "변수" 일반적으로 "개체"를 의미 합니다.사용 하 여 할당 된 메모리 new 는 해당 삭제 해야 delete 문 (또는 사용 하는 경우는 malloc() 함수는 C 런타임 함수를 할당할 수 free()).

동적으로 할당 된 개체-호출 하는 리소스 버그로 인해 특히 복잡 한 코드를 삭제할 것을 잊는 것은 메모리 누수가.이 때문에 원시 포인터를 사용 하는 최신 c + +에서 권장 되지 않습니다.거의 대부분에 대 한 원시 포인터를 래핑하는 것이 더 좋습니다는 스마트 포인터에 자동으로 해제 된 메모리 (코드 스마트 포인터에 대 한 범위를 벗어날 때) 해당 소멸자를 호출할 때. 스마트 포인터를 사용 하 여 하면 거의 버그의 전체 클래스 c + + 프로그램에서 제거 합니다.다음 예제에서는 가정 MyClass 는 공용 메서드를 포함 하는 사용자 정의 형식입니다DoSomeWork();

void someFunction() {
    unique_ptr<MyClass> pMc(new MyClass);
    pMc->DoSomeWork();
}
  // No memory leak. Out-of-scope automatically calls the destructor
  // for the unique_ptr, freeing the resource.

스마트 포인터에 대 한 자세한 내용은 스마트 포인터 (현대 C++).

포인터 변환에 대 한 자세한 내용은 형식 변환 및 형식 안전성 (현대 C++).

일반적으로 포인터에 대 한 자세한 내용은 참조 포인터.

Windows 데이터 형식

Windows 특정 형식 정의 대부분의 함수를 사용 하는 C 및 c + + Win32 프로그래밍에 클래식 및 # 매크로 정의 (정의 windef.h) 형식의 매개 변수를 지정 하 고 값을 반환 합니다.이러한 "Windows 데이터 형식은" 대부분 C/c + + 기본 제공 형식을 지정 하기만 하면 특별 한 이름 (별칭)입니다.이러한 형식 정 및 전처리기 정의 대 한 전체 목록을 참조 하십시오 Windows Data Types.이러한 HRESULT 및 LCID,이 typedef를 유용 하 고 설명입니다.INT와 같은 다른 특별 한 의미가 및 기본적인 c + + 형식에 대 한 단지의 별칭입니다.다른 Windows 데이터 형식은 C 프로그래밍 및 16 비트 프로세서 일에서 유지 되 고 목적이 없거나 최신 하드웨어 또는 운영 체제에 대 한 의미 하는 이름을 갖습니다.특수 데이터 형식으로 나열 된 Windows 런타임 라이브러리와 연관 된 Windows Runtime base data types.최신 c + +의 일반 지침 Windows 형식 값 해석 방법에 대 한 몇 가지 추가적인 의미를 전달 하지 않으면 c + + 기본 형식을 선호 한다는 것입니다.

추가 정보

C + + 형식 시스템에 대 한 자세한 내용은 다음 항목을 참조 하십시오.

값 형식 (C++ 현대)

설명 값 형식 은 함께 사용에 관련 된 문제입니다.

형식 변환 및 형식 안전성 (현대 C++)

공용 형식 변환 문제에 설명 하 고이 방지 하는 방법을 보여 줍니다.

참고 항목

기타 리소스

C + + (현대 C++)를 다시 시작

C + + 언어 참조

표준 C++ 라이브러리 참조