2011 이후 버전부터를 Modern C++ 이라고 한다.

[ auto ]

컴파일 단계에서 자동으로 추론해서 찾아준다.

 

auto 라는건 Type Deduction ( 형식 연역 )

Template 도 비슷한것이다.

 

추론 규칙은 생각보다 복잡해질 수 있다.

 

중요한 한가지 점은

 

기본 auto 는 const 랑 & 무시 한다!!!!!!!!!

 

 

auto 만 덩그러니 놓으면 const 와 & 를 때고 생각하게 된다.

 

강사님이 실질적으로 현업 초반에 실수한 부분이 있는데 

 

아래와 같은 부분이다. 


[ 중괄호 초기화 ]

- 특히나 vector 와 같은 container와 찰떡 궁합이다.

- initializer_list 생성자를 통해 가능하다.

 

C++ 11 이전에는 초기화 하는 방법들이 제각각 다양했다.

 

int a= 0;

int b(0); 

 

처럼 중괄호를 쓰지 못했고 , 놀랍게도 배열은 이미

 

int arr[3] = {1,2,3,4}

 

처럼 위화감 없이 중괄호를 통해 초기화 할 수 있었다.

 

그래서 중괄호 초기화의 목적은 모든 변수들이 최대한 비슷하게 초기화 할 수 있게 하는것이다.

 

벡터를 예를 들어보자면 push_back(); 이나 vector<int> v2(10,1) 말고는 초기화 하는 법이 마땅히 없었다.

 

그러나 ++11 이후부터는 중괄호 초기화를 통해 아래와 같이 초기화 할 수 있게 되었다.

( 마치 배열을 초기화하는것 처럼 )

 

 

그렇다면 벡터를 만들때 어떠한 생성자를 사용하길래

v3 { 1,2,3,4,5... } 와 같이 데이터가 몇개일지 모를 이런 상황이 가능할까?

 

initializer_list 버전의 생성자를 사용하기 때문에 가능하다.

 

마찬가지로 Class 역시 Vector 와 같이 중괄호를 이용해서 생성하고 싶다면 특별한 생성자를 만들어줘야한다.

 

그렇게 되면 아래와 같이 

게 가능하게 된다.

 

그러면 ( 여기서부터 문제인다. )

 

만약 인자로 int를 두개를 받아주는 생성자가 있다고 한다면,

어떤 버전의 생성자가 호출이 될까?

 

실제로 해보면 무조건 initializer_list 버전이 호출이 되는것을 알 수 있다.

( 좋은게 아니다.) initializer_list 가 상위 포식자라고 생각하면 된다.

 

이 부분이 최대 단점이다. 

 

물론 initializer_list 버전의 생성자를 만들어주지 않았다면 문제가 되지 않는다.

 


오늘 강의 결론 : 

 

- 일할때 괄호 초기화()를 기본으로 하는 팀이 있고 

  장점: 전통적인 C++(거부감 없음)

          vector 등 특이한 케이스에 대해서만 { } 사용

 

- 반대파, 중괄호 초기화 {} 를 하는 팀은

 장점 : 초기화 문법의 일치화

          축소 변환 방지 

int a=10;
float b(a);

하면은 통과하는데

 

중괄호 초기화로는 통과하지 않는다 ( 축소 변환을 조금 엄격하게 따진다.) 

-> 장점이라면 장점일수 있다.

 


[ nullptr ]

nullptr 문법이 ModernC++ 에서 왔다는것도 모를 정도로 사람들이 많이 사용하고 있다.

 

그럼 그 전에는 무엇을 사용했을까? 0, NULL 이라는 값을 사용했다.

int* ptr = 0;
int* ptr = NULL; ( define 해준것 )

그럼 이게 왜 문제냐? 왜 새로운게 나왔나?

사실 nullptr 도 0이랑 크게 다를바가 없다. nullptr을 실제 살펴보면 0이다.

 

 

1. 가독성 

auto knight = FindKnight();

if(knight ==nullptr){ //TODO }

 

2. 함수 오버로딩 

Test 함수가 Test(int a) Test(void* ptr) 두가지 버전이 있을때

Test(0);

Test(NULL);

 

둘다 모두 Test(int a ) 버전이 호출된다.

 

결국 Test(nullptr) 하면은 Test(void* ptr)을 호출해준다.

 

그렇다면 nullptr이 어떻게 구현되어 있는지 간단한 커스텀 Nullptr을 구현하면서 알아보자.

 

구현하는 부분은 강의로 다시 듣는게 좋을것 같다!

 


private:
	void operator &() const; // &를 통해 주소값을 접근하는것을 private으로 설정해서 막아주었다. ( 꼼수 )

 

참고로 이렇게 굳이 private로 막아서 사용 못하게 막지 말고 C++11 delete 키워드를 사용해도 된다.

 

void operator &() const = delete;

 

 

어떤 객체가 실질적으로 어떤 포인터 타입을 요구할때 ( ex. 함수 인자로 어떤 특정 포인터 타입을 요구할때  )

만든 Nullptr을 사용하면 자동으로 operator T* 에 의해 자동으로 형변환이 되어 호환이 가능해진다.

 

 

class를 설계하면서 바로 선언하면 class 이름을 적어주지 않아도 된다.
class A{
	// 구현부
}
A a;

위에는 A 클래스를 만들고 객체 a를 생성해준거고

아래는 Class를 만들고 객체를 만든게 아니라 class 선언을 하자마자 만들어준것이다.

class A{
	// 구현부
} a;​

아래 처럼 만들었을 경우 심지어 class 이름을 생략해도 된다.
class 이름이 중요하지 않기 때문에, 애당초 a라는 객체 하나만 만들어 줄거기 때문에.
class{
	// 구현
} a;​

 

 

const 클래스 참고.

https://forward-movement.tistory.com/199

 

 

'C++과 언리얼로 만드는 게임 개발 > Part1. C++ 문법' 카테고리의 다른 글

Day13 ( 84.82% )  (0) 2022.04.26
Day12 ( 82.14% )  (0) 2022.04.20
Day10 ( 79.46% )  (0) 2022.04.17
Day9 ( 71.42% )  (0) 2022.04.04
Day8 - ② ( 64.28% )  (0) 2022.03.31

+ Recent posts