[EC++] 시작하며

후이재·2020년 8월 22일
1
post-thumbnail

본격적인 C++ 강화를 위해 스콧마이어스의 Effective C++서적을 들여다 보게 되었다.
55개의 item을 정확하게 습득하려 한다.

소개

이 책에 대하여

  • 이 책의 목적은 C++을 효과적으로 구사하는 방법을 알려주는 것
  • 무작정 따라하기 이런 내용 아님
  • 일상에서 자주 부딪히는 문제를 피하는 방법, 지금보다 효율을 더 높이 올리는 방법에 대한 지침
  • 안목을 기르자는 목표를 가짐

용어 설명

  • 선언(desclaration): '어떤 대상'의 타입과 이름을 컴파일러에게 알려주는 것
    -객체 선언: extern int x;
    -함수 선언: std::size_t numDigits(int number);
    -클래스 선언: class Widget;
    -템플릿 선언: template< typename T> class GraphNode;

  • 시그니처(signature): 함수의 반환 타입과 매개변수
    - std::size_t numDigits(int number)의 시그니처는 std::size_t(int t)

  • 정의(definition): 선언에서 빠진 구체적인 세부사항을 컴파일러에게 제공하는 것
    - 컴파일러가 그 객체에 대한 메모리를 마련해 놓는 것

    int x; // 객체 정의 
    std::size_t numDigits(int number) // 함수 정의
    {
    	std::size digitSoFar = 1;
       
       while ((number /= 10) != 0) ++digitSoFar;
       return digitSoFar;
    }
    class Widget{ // 클래스 정의
    public:
    	Widget();
       ~Widget();
       ...
    };
    template<typename T> // 템플릿 정의
    class GraphNode{
    public:
    	GraphNode();
       ~GraphNode();
       ...
    }
    
  • 초기화(initialization): 어떤 객체에 최초의 값을 부여하는 과정. 사용자 정의 타입 객체의 경우 생성자에 의해 이루어짐
    - 기본생성자(default constructor): 어떤 인자도 주어지지 않은 채로 호출될 수 있는 생성자
    - explicit키워드를 사용하면, 암시적인 타입 변환을 수행하는데 쓰이지 않음

    class A{ 
    public:
    	A(); // 기본 생성자
    };
    class B{
    public:
    	explicit B(int x =0, bool b = true) // 기본 생성자, x, b 기본값 지정
    };
    class C{
    public:
    	explicit C(int x); // 기본 생성자 아님
    }
    
  • 객체 생성

    void doSomething(B bObject);
    B bObj1;
    doSomething(bObj1);
    B bObj2(28); // b는 디폴트인 true로
    doSomething(B(28)); // 캐스팅!
    
  • 복사생성자(copy constructor)
    - 객체의 초기화를 위해 같은 타입의 객체로부터 초기화시 호출되는 함수.
    - 복사대입 연산자(copy assignment operator): 같은 타입의 다른 객체에 더떤 객체의 값을 복사하는 용도

    class Widget{
    public:
    	Widget(); // 기본 생성자
      Widget(const Widget& rhs); // 복사 생성자
      Widget& operator=(const Widget& rhs); // 복사 대입 연산자
      ...
    };
    Widget w1; // 기본 생성자 호출
    Widget w2(w1); // 복사 생성자 호출
    w1 = w2; // 복사 대입 연산자 호출 (=는 복사 생성자 호출에 쓰일 수 있음 Widget w1 = w2/ 값에 의한 객체 전달을 정의해주기도 함 if(func(aWidget))의 경우, 값을 복사해서 보내주는 것)
    
  • STL(Standard Template Library)
    -C++의 표준 라이브러리에 속해있는 라이브러리
    -컨테이너, 반복자, 알고리즘과 관련된 기능을 함수객체가 차지

  • 미정의 동작(Undefined behavior)
    - 실행 시간에 어떤 현상이 터질지 예측할 수 없다 => 하드가 날라갈 수 있는 안좋은 상황

      int *p = 0; // null 포인터
      std::cout << *p // null 포인터 역참조(미정의 동작)
      char name[] = "Darla"; // 6칸짜리 배열
      char c = name[7]; // index오류(미정의 동작)
    
  • 인터페이스(interface)
    -함수의 시그니처, 혹은 어떤 클래스의 접근가능 요소
    -일반적인 설계 아이디어로서의 인터페이스

  • 사용자(client)
    -우리가 만든 코드(인터페이스)를 사용하는 아무개 혹은 아무것
    -함수를 호출하는 코드, 코드작성자, 유지보수하는 자 등등
    -이 책에서는 사용자를 프로그래머로 봄(잘못 만들면 골치아파하는 쪽이 프로그래머이므로
    -사용자의 인생을 편하게 만들자!!!
    -ctor: 생성자/ dtor: 소멸자

이름짓기 규칙

  • lhs(left-hand side, 좌변), rhs(right-hand side, 우변)

    const Rational operator*(const Rational& lhs, const Rational& rhs);
  • 포인터 pt
    -Widget 포인터: pw
    -Airplane 포인터: pa
    -GameCharacter 포인터: pgc

  • 멤버함수 mf

스레딩에 대한 고려사항

  • C++언어 차원에서 스레드에 대한 개념 자체가 없음
    - 스레드의 안전성과 힘들게 싸우고 있는 프로그래머들
    => C++구문요소 중 스레드 환경에서 문제를 일으킬 만한 것을 지적해줄 것임

TR1 그리고 부스트

  • TR1(Technical Report 1)
    -C++ 표준 라이브러리에 새로 추가되는 기능들에 대한 명세
    -클래스 및 함수 템플릿이 주류, 해시 테이블, 참조 카운팅 방식 스마트 포인터, 정규 표현식 등
    -tr1 네임스페이스에 모두 포함. tr1네임스페이스는 std네임스페이스 안에 중첩됨

  • 부스트
    -전문가로부터 교차 검증을 거친 플랫폼 간 이식성도 가진 오픈소스 C++라이브러리를 제공하는 단체
    -웹사이트: http://boost.org
    -TR1의 구성요소 중 대부분이 이곳에서 만들어짐

profile
공부를 위한 벨로그

0개의 댓글