달력

112017  이전 다음

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  

요새 좀 보고싶은 오픈 소스들이 죄다 C++로 되어있어서 학습하고있다

http://www.learncpp.com/  여기서 후다닥 보고있는데 집중력이 20분을 못가네....ㅋㅋㅋㅋㅋ;;;


Pointer 와 reference의 차이

레퍼런스가 syntactic sugar인건 알겠는데, 포인터와 차이점은 무엇인가?

  1. 포인터는 재할당이 되지만, 레퍼런스는 한번 초기화 하면 변경하지 못한다.
  2. 포인터는 null을 가리킬수 있지만, 레퍼런스는 꼭!어떤걸 참조 해야한다.
  3. 포인터 자체 주소값은 가져올수 있지만, 레퍼런스는 할수 없다.
  4. reference arithmetics가 없다.
http://yosefk.com/c++fqa/ref.html  (fqa가 갑이구나...)


Constructor initialization lists

composition 혹은 상속관계에 있는것들은 저렇게 초기화하는걸 강력하게 추천!!! 이라고 한다
(const, reference상관없이)


Derived class initialization


생성자를 호출하게 되면 5가지의 초기화가 발생하는데

  1. 메모리 할당
  2. 적합한 생성자 호출
  3. initialization list 실행
  4. 생성자 body 실행
  5. 호출한 곳으로 제어권 넘김
여기서 상속받은 클래스는 한가지가 더 추가된다
  1. 메모리 할당
  2. 적합한 생성자 호출
  3. 적합한 부모 생성자 호출로 부모 객체 생성
  4. initialization list 실행
  5. 생성자 body 실행
  6. 호출한 곳으로 제어권 넘김

자식 클래스에서 부모 클래스 변수를 초기화 하는 방법은?  initialization list로는 할 수 없다. initialization list는 
같은 클래스의 변수만 초기화 할수 있다
const, reference 변수때문. 그리고 제약을 함으로서 모든 변수의 초기화는 한번만 하는것을 보장해준다

부모 클래스의 변수는 다음과 같이 초기화 시킨다.

Inheritance and access specifiers

상속 타입, 멤버 변수 접근자 default는 private이다

멤버 변수 접근자 3개(public, private, protected) * 상속 타입 3개(public, private, protected) 총 9개의 조합이 생성된다.    미안하다 복붙한다...ㅜ,ㅜ

Public inheritance
Base access specifierDerived access specifierDerived class access?Public access?
PublicPublicYesYes
PrivatePrivateNoNo
ProtectedProtectedYesNo
Private inheritance
Base access specifierDerived access specifierDerived class access?Public access?
PublicPrivateYesNo
PrivatePrivateNoNo
ProtectedPrivateYesNo
Protected inheritance
Base access specifierDerived access specifierDerived class access?Public access?
PublicProtectedYesNo
PrivatePrivateNoNo
ProtectedProtectedYesNo


Virtual Base classes

다중 상속의 문제점중에 하나가 diamond problem이다. Base class가 두번 호출이 된다.  그때 virtual 사용
virtual function 사용할때 자식 클래스에는 안써도 문제 없지만, 씀으로서 상기시킨다는 의미로 virtual을 쓰는걸 추천한다.  
virtual function에서 파라미터나 리턴 타입이 다르면 의도한대로 동작하지 않는다.

예외적으로 리턴 타입이 자식,부모 관계의 포인터나 레퍼런스라면 동작한다. (value는 안되네요;;)


(실력 부족이 가장 큰 원인이겠지만 C++은 다른 언어보다 알아야할게 너무 많은것같다. 기본만 하고 프로젝트 보면서
하나하나 공부하는걸로~)

저작자 표시 비영리
신고
Posted by 오산돌구