[특강] 강석민 강사님 advanced c++ 1일차


특강명 : advanced C++ 

강사님 : 강석민

cafe.naver.com/cppmaster

smkang@ioacademy.co.kr


[1일차 수업 내용]

1.thiscall

2.temporary object 

3.const member finction

4.conversion(변환 연산자 / 변환 생성자)


자료(cpp 파일) :

[넥슨특강]C 개념_1일차.zip



1. thiscall

[수업내용]

멤버함수 호출 원리 

일반 함수 포인터에 멤버 함수의 주소를 담을 수 없다.

일반 함수 포인터에 static 멤버 함수의 주소를 담을 수 없다.

멤버 함수 포인터를 만드는 방법과 사용하는 방법


[정리]

멤버함수 호출시 첫번째 인자로 this가 함께 넘어간다.

API C 함수에서 함수로 인자 넘어가는것은 (callback함수) 반드시 this가 넘어갈 수 없으니 static으로 넘어가야한다.

그러므로 this를 넘길 수 없으므로 API 추가 인자로 void*같은 형태로 넘긴다.

class의 경우 함수 인자로 넘길 수 없는 상황이 생긴다.

그러면 같은 부분을 찾아서 this를 보관하는 방법을 사용한다. (handle map 을 말함)



2.temporary object 

(임시객체와 참조 리턴 이야기)


[수업내용]

함수에서 usertype을 값으로 리턴하는 경우 임시객체

임시객체를 막기위해서 참조를 리턴


* tempate 기반 컨테이너 최적화

-> 제거와 리턴을 동시에 하면 최적화할 수 없다 그래서 stl의 경우 top/pop을 분리해서 사용한다.



3.const member finction

(상수 객체는 상수 함수만 호출 할 수 있다)


[수업 내용]

상수 객체는 상수 함수만 호출할 수 있다.

멤버 data의 값을 변경하지 않은 모든 함수를 상수 함수를 만들어야한다.

논리적 상수성


객체가 상수일 경우를 고려해야한다.

객체의 상태를 변경하지 않는 모든 멤버 함수는 상수함수가 되어야한다(선택이 아니라 반드시!!!!!!) 

(문제가 발생시 const를 제거하는 짓은 하지말자... 그런 개발자 많이봄 ㅋㅋ)


* 논리적 상수성

-> 논리적으로는 상수이지만 물리적으로는 상수가 아닌 경우

해결책 1 : 변해야하는 멤버 data를 mutable로 선언 (변경해야하는 데이터가 적을 경우 사용하자..)

해결책 2 : 변하는 것은 별도의 구조체를 뽑아내고 포인터를 가지고 있자!! (추천)



4.  변환 연산자 / 생성자

[수업내용]

변환 연산자 : A => 기본 타입 B

변환 생성자 : 기본 타입 B => A


객체가 아닌 B는 멤버함수를 가질 수 없다.

A클래스의 변환 생성자가 있으면 1개짜리 임시객체를 만들어서 대입연산자를 불러서 넣어줌!! (매개변수 1개짜리 타입에 맞는 생성자)


변환 생성자는 의도치 않게 암시적 형변환이 발생하기도 한다!!(문제 발생!)

그렇기때문에 의도한 결과가 나오기위해서 키워드가 존재함 (explicit)


즉! explicit 생성자를 가지는 객체는 반드시 ()로만 초기화 해야한다. (=로 초기화하면 error!!)

ex)  스마트 포인터를 초기화하는 경우를 확인해보자

shared_ptr<int> p1 = new int; // ERROR

shared_ptr<int> p1(new int); // OK (이유는 explicit!!) 

   -> 아 이것은 explict이구나~ 라고 떠올릴줄 알아야함!


* Tip : Safe Bool 에 대한 이야기

링크로 대체..

http://oidoman.blog.me/90192334845


이 글을 공유하기

댓글

Designed by JB FACTORY