이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

코딩/C and C++

C++11 문법적 변경 사항

이쿠우우 2020. 9. 13. 11:01
반응형

 

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