ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 기초 익히기
    개발하면서/etc 2014. 11. 15. 21:11
    반응형

    요새 좀 보고싶은 오픈 소스들이 죄다 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

    class Something
    {
      private:
    	const int m_nValue;
    	double m_dValue;
    	int *m_pnValue;
      public:
    	Something(int nValue=0, double dValue=0.0, int *pValue=0)
    		:m_nValue(nValue),m_dValue(dValue),m_pnValue(pValue)
    	{
    	}
    };

     

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

     

    Derived class initialization

     

    class Base
    {
      public:
    	int m_nValue;
    	Base(int nValue=0) : m_nValue(nValue)
    	{}
    };
    
    class Derived : public Base
    {
      public:
    	double m_dValue;
    	Derived(double dValue = 0.0) : m_dValue(dValue)
    	{}
    };
    
    int main()
    {
        Base cBase(5);
        Derived cDerived(1.1);
    
        return 0;
    }
    

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

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

    자식 클래스에서 부모 클래스 변수를 초기화 하는 방법은?

    initialization list로는 할수 없다.  initialization list는 같은 클래스의 변수만 초기화 할수 있다.

    const, reference 변수 때문, 그리고 제약함으로써 모든 변수의 초기화는 한번만 하는것을 보장한다.

     

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

    class Base
    {
      public:
    	int m_nValue;
    	Base(int nValue=0) : m_nValue(nValue)
    	{}
    };
    
    class Derived : public Base
    {
      public:
    	double m_dValue;
    	Derived(double dValue = 0.0, int nValue=0) : Base(nValue), m_dValue(dValue)
    	{}
    };
    
    int main()
    {
        Derived cDerived(1.3, 5);
        return 0;
    }
    

    Inheritance and access specifiers

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

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

     

    Public inheritance
    Base access specifier Derived access specifier Derived class access? Public access?
    Public Public Yes Yes
    Private Private No No
    Protected Protected Yes No
    Private inheritance
    Base access specifier Derived access specifier Derived class access? Public access?
    Public Private Yes No
    Private Private No No
    Protected Private Yes No
    Protected inheritance
    Base access specifier Derived access specifier Derived class access? Public access?
    Public Protected Yes No
    Private Private No No
    Protected Protected Yes No

     

    Virtual Base classes

    다중 상속의 문제점중에 하나가 diamond problem이다. Base class가 두번 호출이 된다.  그때 virtual 사용

    virtual function 사용할때 자식 클래스에는 안써도 문제 없지만, 씀으로서 상기시킨다는 의미로 virtual을 쓰는걸 추천한다.

    virtual function에서 파라미터나 리턴 타입이 다르면 의도한대로 동작하지 않는다.

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

     

    (실력 부족이 가장 큰 원인이겠지만 C++은 다른 언어보다 알아야할게 너무 많은것같다.

        기본만 하고 프로젝트 보면서 하나하나 공부하는걸로~)

    반응형

    댓글

Designed by Tistory.