19
Effective C++ NHN NEXT 양양양

More effective c++ 1

  • Upload
    -

  • View
    247

  • Download
    1

Embed Size (px)

Citation preview

Page 1: More effective c++ 1

Effective C++NHN NEXT

양현찬

Page 2: More effective c++ 1

포인터와 참조자를 구분하자

• 위와 같은 상황이 없도록 하자 ( 실재로 어디서 몇 번 본 것 같다 )• 널 참조자 라는 개념은 존재하지 않는다 .( 무조건 초기화 )• 포인터보다 참조자 사용이 더 효율적일 수 있다 .• 참조자는 초기화 된 객체만 참조 ( 변경할 수 없다 )• 포인터는 하나의 변수를 가지고 여러 개의 객체를 바꾸어 사용할 경우

사용

Page 3: More effective c++ 1

참조자의 반환

• 위 코드는 vector 의 operator[] 이다 .• 참조자를 반환하고 있다 .• Operator[] 를 사용할 때에는 참조자를 반환해야 한다 .• 이에 관한 자세한 이야기는 나중에• 몇몇 Operator 연산자는 참조자를 반환한다 .

Page 4: More effective c++ 1

C++ 스타일의 캐스팅을 쓰자• 눈에 잘 보여서 가독성이 좋다 .• 종류에 따라 사용되기 때문에 프로그래머의 의도까지 컴파일러에

의해 제어할 수 있다 .• C++ 스타일의 캐스팅이 없는 컴파일러라고 큰소리 치지 마라• 없으면 만들어서 사용해라 .

Page 5: More effective c++ 1

배열과 다형성은 수준이 다르다

어떤 결과가 나오게 될지 아무도 모른다 .

컴파일러는 아무 말도 하지 않는다 .

Page 6: More effective c++ 1

쓸데 없는 기본 생성자는 그냥 두지 말자

기본생성자가 아니라 만들어서 사용할 경우 문제점이 많다 .

대부분의 템플릿 코드들은 기본 생성자를 가진다는 가정하에 만들어진 경우가 많다 .

Page 7: More effective c++ 1

해결을 위한 3 가지 방법이 있다 .

Page 8: More effective c++ 1

Placement new 를 사용할려면

생성자 , 소멸자 호출 등의 자세한 이야기는 나중에

Page 9: More effective c++ 1

사용자 정의 타입변환 함수• 컴파일러가 사용하는 타입변환은 두 가지이다 .• 1_ 단일 인자 생성자 ( 그냥 생성자이다 )• 2_ 암시적 타입변환 연산자 ( 변환타입 앞에 operator 가 붙은 함

수 )• 타입변환 함수들은 제어하기가 힘들다 .• 암시적 타입변환 연산자보다 String 의 c_str 함수처럼 변환함수를

제공하자• 단일 인자 생성자의 암시적 변환을 막고 싶다면 explicit 을 이용하자

Page 10: More effective c++ 1

컴파일러가 explicit 따윈 모른다고 할 경우

• 단일 생성자와 암시적 타입변환 연산자는 동시에 쓰이지 않는다 .• 이 점을 이용하여 암시적 타입변환을 막을 수 있다 .

였지만… .. 책이 나온 예제가 vs12 컴파일러에서는 먹히지 않는다 . Int 형 10 을 ArraySize(int) 생성자를 통해 암시적으로 변환하지 못하고 있다 .

Page 11: More effective c++ 1

++, -- 이것들의 앞뒤를 구분하자

웃긴 방법으로 두 가지를 구분하고 있다 .

Page 12: More effective c++ 1

후위 연산자를 const 로 반환함으로 서 위 형태의 연산자를 막는다 .

후위연산자는 반드시 전위연산을 사용하여 구현해야 한다 .

Page 13: More effective c++ 1

&&, ||, , 연산자는 오버로딩 대상이 결코 아니다 .

• C++ 는 복합적인 표현식의 처리는 단축평가를 할 수 있다 .• 함수호출로 이루어질 때 단축평가가 이루어지지 않는다 .• 매개변수의 평가순서를 알 도리가 없다 .

쉼표연산자

Page 14: More effective c++ 1

쉼표 연산자

• 쉼표연산자도 일정한 규칙에 따라 작동한다 .• 왼쪽 표현이 오른쪽표현보다 먼저 작동한다 .• 원래의 쉼표연산자는 흉내를 낼 수 없다 .

Page 15: More effective c++ 1

C++ 연산자오버로딩이 불가능한 연산자

단순히 오버로딩이 가능하다고 해서 무조건 해서는 안 된다 .

Page 16: More effective c++ 1

New 와 Delete 의 의미를 정확히 이해하자• New 연산자와 operator new 는 다르다 .• 이전의 연산자 표를 보면 나오듯 new 연산자는 할당을 위한

연산자로 기능을 바꿀 수 없으며 우리가 흔히 사용하는 연산자이다 . • Operator new 는 new 연산자가 호출하는 함수이다 .• Operator new 가 하는 일은 그저 할당하는 일이다 . 생성자가

무엇인지 알 턱이 없다 .

Page 17: More effective c++ 1

New 연산자가 하는 일

Page 18: More effective c++ 1

Placement new

• 미 초기화 메모리를 할당한 후 생성자를 호출 할 때 사용• Operator new 에서 할당된 buffer 가 추가된 형태• 연산자 delete 와 operator delete 역시 같은 구조이다 .

Direct X 에서 제공하는 A16 메트릭스를 이용하면 메모리를 16 으로 alignment 해라는 압박의 메시지를 주기도 한다 .

이때 16 으로 alignment 된 메모리를 할당하고 placement new 를 사용한다 .

Page 19: More effective c++ 1

배열

• 위에서 사용되는 연산자는 같지만 호출하는 함수가 다르다 .• 위에서는 operator new[] 를 호출한다 .• 물논 해제할 때는 operator delete[] 을 사용해주어야 한다 .