C++11 문법적 변경 사항
초기화 리스트 및 초기화 방법의 통합
클래스의 각 맴버를 생성자에서 초기화 할 때
생성자 뒤에 클론연산자( : )를 사용해서 객체의 멤버를 초기화 할 수 있음,
초기화 리스트의 장점
[초기화 리스트를 사용하지 않을경우]
생성자내에서 초기화를 한다면
기본생성자를 통해 한번 호출한 후 대입연산자를 호출함.
[초기화 리스트를 사용 시]
기본생성자를 호출하지 않고 입력받은 값으로 한번에 객체를 생성하게 됨,
즉 기본 생성자를 호출하여 임시 변수를 만들 필요없이 한번에 초기화 됨,
불필요한 연산을 줄일 수 있음,
새로운 타입의 추가 : long long형 정수
unsigned long long 형
64비트 이상의 값을 표현할 수 있음.
long long 타입의 최대 값 매크로 : LLONG_MAX
접미사(리터럴 Literal) : long long 또는 u11 또는 U11 또는 uLL 또는 ULL
리터럴 이란?
데이터 그 자체를 의미함
변수에 넣는 변하지 않는 데이터를 의미.
상수 ( Constant ) = 변하지 않는 변수 (메모리 위치)
리터럴 ( Literal ) = 변수의 값이 변하지 않는 데이터 (메모리 위치 않의 값)
bool 형 타입
C++ 에서는 C언어와 마찬가지로 0 : false ,1 : true 로 인식
하지만 C++11 부터는 bool 타입을 제공.
참(true)이나 거짓(false) 중 한 가지 값만을 가질 수 있음.
[묵시적 타입 변환이 가능]
0인 값은 거짓(false)으로,
0이 아닌 값은 참(true)으로 자동 변환.
묵시적 타입 변환이란?
대입 연산이나 산술연산에서 컴파일러가 자동으로 타입 변환을 해주는 것
대입 연산 시 왼쪽에 존재하는 데이터 타입으로 묵시적 타입변환이 됨
산술 연산 시에는 데이터의 손실이 최소화되는 방향으로 묵시적 타입변환이 됨
자동 타입 변환 : auto
변수의 초기화 값에 맞춰 변수의 타입을 추론할 수 있음.
변수를 초기화할 때 특정 타입을 명시하는 대신
auto 키워드를 사용하여 초깃값에 맞는 타입이 자동으로 선언됨.
기존의 auto 키워드는 자동 저장소 클래스에 있는 지역 변수를 선언하는데 사용
하지만 의미가 없어서 c++11 부터 재정의함.
자동 저장소 클래스란?
Storage Class Specifiers
선언에 사용할 수 있는 키워드
정보를 어떤 저장소에 보관할 건지 지정해주는 예약어
배열
1. 값을 명시하지 않고 괄호({})만을 사용하여 초기화하면, 모든 배열 요소를 0으로 초기화할 수 있음.
2. 초기화 리스트를 사용하여 배열을 초기화할 경우에는 narrowing cast를 할 수 없음.
narrowing cast 란
int test = 3.14
위와 같이 int 형 변수에 실숫값을 넣으면
자동으로 int 형으로 암시적인 타입변환을 하는데
3으로 변환되며 0.14 가 손실되는 것을
narrowing cast 라고 함.
C++11에서는 초기화 리스트를 이용한 초기화에서 narrowing cast 가 발생하면
경고(warring)을 발생시킴.
3. array 템플릿 클래스가 추가
널 포인터 상수 추가 : nullptr
null pointer : 아무것도 가리키고 있지 않는 포인터.
C++11 이전에는 null pointer 를 표현하기 위해서 포인터를 0으로 초기화 해왔음.
하지만 C++11 부터는 nullptr 키워드를 제공하여
0으로 초기화된 null pointer 보다 더욱 직관적으로 null pointer 를 표현할 수 있게 되었음.
열거체의 범위 지정
열거형 클래스 (enum class)
1. 다른이름의 중복 데이터 선언 가능.
2. 정수형 변수로 암시적 변환이 되지 않음.
새로운 스마트 포인터 추가
smart pointer
C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는,
반드시 delete 키워드를 사용하여 해제해야 함.
C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해
스마트 포인터를 제공.
스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로
사용이 끝난 메모리를 자동으로 해제 해줌.
스마트 포인터 종류
[unique_ptr]
하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록,
객체에 소유권 개념을 도입한 스마트 포인터.
make_unique() 함수를 사용해서 unique_ptr 인스턴스를 안전하게 생성함.
[shared_ptr]
shared_ptr은 하나의 특정 객체를 참조하는 스마트 포인터가
총 몇 개인지를 참조하는 스마트 포인터.
[weak_ptr]
weak_ptr은 하나 이상의 shared_ptr 인스턴스가
소유하는 객체에 대한 접근을 제공하지만,
소유자의 수에는 포함되지 않는 스마트 포인터.
범위 기반 for 문 추가
for 문의 새로운 형태
표현식 안에 포함되어 있는 모든 값에 대해 한번씩 루프를 실행함
범위 기반의 for 문은 배열을 자동으로 인식
컨테이너 클래스에 많이 사용됨
(예제)
int arr[5] = {1, 3, 5, 7, 9};
for (int element : arr)
{
cout << element << " ";
}
결과 : 1 3 5 7 9
람다 함수와 람다 표현식 추가
람다 함수 사용법
[ ] { }
[ ] ( 인자 ) { }
람다 함수 표현식
함수를 미리 정의하지 않고 필요한 시점에서 사용하고 바로 버리는 것
1) "[ ]" 람다 소개자 ( Lambda Introducer )
외부 변수를 어떤식으로 참조할지에 대한 Capture 지정자
2) "( )" 파라미터 지정자 ( Parameter Specifier )
람다 함수에 넘겨줄 인자를 입력
3) "{ }" 람다 몸체 ( Lambda Body )
구현 코드가 존재
타입 변환 연산자 추가 : explicit
타입 변환 연산자는 기본적으로
묵시적 형 변환 (Implicit Cast)
명시적 형 변환 (Explicit Cast)
두가지로 구분됨
(예제)
int i = 0;
char ch1 = i; // 묵시적 형 변환(Implicit Cast)
char ch2 = (char)i; // 명시적 형 변환(Explicit Cast)
C++11 에서는 추가로 4가지 연산자를 제공함
[static_cast]
논리적으로 변환 가능한 타입을 변환하는 연산자.
컴파일 시점에 안정성을 검사.
static_cast 연산자는 사용자가 정의한 클래스가 아닌
C++ 내부에 이미 정의된 기본 자료형간의 형변환을 하고싶을 때 사용할 수 있음.
[dynamic_cast]
런타임 시점에 안정성을 검사.
클래스의 상속관계에서 형변환을 보다 안전하게 처리.
자식 클래스의 참조/포인터 형식에서 부모 클래스의 참조/포인터 형식으로 형변환을 허용.
-
즉 부모 클래스 포인터 타임이 자식 클래스 타입으로 형변환은 안됨
하나 이상의 가상함수를 가진 다향성 클래스에 한해서는
부모 클래스의 참조/포인터 형식에서 자식 클래스의 참조/포인터로 형변환을 허용.
-
즉 자식 클래스에서 부모 함수의 가상함수가 하나 있으면 형변환을 할 수 있음
[reinterpret_cast]
포인터/참조 타입에 상관없이 무조건 형변환.
포인터/참조와 관련된 형변환만 지원.
타입을 재해석하는 용도.
[const_cast]
const 성질을 제거하고 싶을 때 사용.
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
'코딩 > C and C++' 카테고리의 다른 글
네임드 파이프 (Named-Pipe) (1) | 2020.10.04 |
---|---|
C++에서 JSON 사용 (4) | 2020.09.13 |
JSON (0) | 2020.09.13 |
C와 C++ 차이점 (1) | 2020.09.13 |
CreateThread, _beginthreadex 차이점 (0) | 2020.09.03 |