IT책 (12) 썸네일형 리스트형 1.8 함수를 인수로 전달하기 다른 함수에 인수로 넘길 함수의 서명은 매개변수 서명으로 결정되며 매개변수 명세는 함수 인수의 성격에 따라 정해지고 다른 함수에 함수를 인수로 넘기는 방법은 세 가지가 있다. 함수 포인터를 사용한다. 즉,함수 이름을 인수값으로 사용한다. 하지만 밑의 두가지 방법이 더욱 더 좋다 함수 객체를 인수로 전달 람다 표현식을 인수로 전달 함수 객체(종종 펑터(함수연산자)라고 부른다고한다)는 함수 호출 연산자 operator()()를 오버로딩 한 클래스의 객체를 말한다 함수 객체는 원시 함수 포인터를 사용하는것보다 더 효율적으로 함수를 다른함수에 인자로 전달하는 방법을 제공한다. #include #include #include #include #include using namespace std; class calc.. 1.7 알고리즘 변경 불가 순차열 연산 말 그래도 보고 찾고 세는것만 한다 find(),cout(),mismatch(),search(),equal()가 있다 변경 가능 순차열 연산 원소들을 변경이 가능하다 swap(),copy(),transform(),replace(),remove(),reverse(),rotate(),fill(),shuffle()가 있다 정렬 병합등 순차열의 순서를 변경한다 sort(),stable_sort(),binary_search(),marge(),min(),max()가 있다 1.6 스마트 포인터 스마트 포인터는 원시(일반)포인터처럼 주소를 담고있지만 두가지 차이점이있다 첫 번째는 스마트 포인터는 자유 공간에 할당된 메모리의 주소만 지정할 수 있고 원시 포인터에는 하던 증가,감소 같은 산술연산은 불가능하다. 자유 공간에 생성된 스마트 포인터는 객체에 할당된 메모리가 자동으로 해제되니 delete를 사용할지 말지 고민하지않아도 된다 다시말해 메모리 누수걱정이없다는것이다. 그리고 객체가 아닌 포인터를 저장하면 다형성을 유지할수있다. unique_ptr은 말 그대로 유니크하다 하나만 존재할수있어며 복제또한 불가능하다 A라는 unique_ptr에서 B라는 unique_ptr의 이동은 가능하다 unique_ptr보다 유니크 make_unique로 생성하는것이 더욱 좋다 //unique_ptr int _tm.. 1.4~5 반복자 반복자는 포인터와 비슷하게 동작하는 클래스 템플릿 타입의 객체이다. iter가 클래스를 가르킨다면 iter->member 이런식으로 사용할수 있다. 반복자는 컨테이너 종류와 상관없이 컨테이너에 있는 원소들과 알고리즘을 이어주며 데이터에서 알고리즘을 분리시켜준다 반복자는 원소들을 한 쌍을 사용하는게 보통이며 범위는 begin반복자(첫번째 원소를 가르킴) ~ end반복자(마지막 원소+1위치를 가르킴)그리고 end반복자는 역참조가 될수없다. 반복자 유형은 선택한 컨테이너의 종류에 따라 결정되며 배열 컨테이너 또는 문자열 객체의 const반복자를 반환하는 전역 함수 cbegin()과 cend()가 있으니 기억하자(const 반복자는 변경되지 말아야 할 것을 가리키지만 반복자 자체는 바꿀 수있다.(예제 추가 예정.. 1.3 컨테이너 STL 기능의 대부분은 컨테이너와 관련되어있고 근본이라고 말할수도있다 컨테이너는 객체를 일정한 방식으로 저장하는 조직화하는 개체를 말한다. 컨테이너를 사용한다는 건 데이터에 접근하기 위해 반드시 반복자를 사용한다는 것이므로 반복자도 이해해야 한다. 컨테이너는 순차 컨테이너, 연관 컨테이너, 컨테이너 어뎁터로 나뉘어져있다. 순차 컨테이너는 객체를 션형으로 저장하지만 반드시 연속된 메모리로 저장될 필요가없다.멤버함수를 호출하거나 반복자를 사용해서 객체들을 차례로 접근할 수 있다. 또한, 때에 따라서는 첨자 연산자와 인덱스를 사용해서 접근할수도 있다 연관 컨테이너는 객체들을 연관된 키와 함께 저장한다. 그 키를 이용해서 객체를 가져온다. 반복자를 사용해서도 가능하다 컨테이너 어댑터는 순차 컨테이너나 연관 컨테.. 항목 10 : 대입연산자는 *this의 참조자를 반환하게 하자 class test { test& operator =(const test& param){return *this;} test& operator -=(const test& param){return *this;} test& operator +=(const test& param){return *this;} test& operator *=(const test& param){return *this;} test& operator /=(const test& param){return *this;} } 대입연산자에는 return *this의 참조자를 반환하자 다른거 써도 딱히 뭐 잘못된다는건 아니지만 관례라고한다 그냥 지켜주자 이것만은 잊지 말자! *대입 연산자는 *this의 참조자를 반환하도록 만들어야한다 항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 갓아 함수를 호출하지 말자 class base_test { public: base_test() { print(); } void print() const { cout 항목 8 : 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 예외처리는 중요하다. 왜냐? 아주 극단적이지만 예를 들어보겠다. #include #include using namespace std; char* err_log; class test { public: int size = 0; ~test() { cin >> size; err_log = new char[size]; } }; int _tmain() { test t; } 만약 프로그램이 돌아가고있는데 그 상태에서 test클래스는 log를 저장해주는 클래스라고 쳐보자 그런데 size입력하는곳에 갑자기 11111111111111이라는 말도안되는 크기를 할당하겠다고 하면은 어떻게 되겠는가? 당연하지만 인정사정없이 뻗어버린다. 조그만한 에러가 떠서 잠시 log만 저장하러갔는데 아주 운없이 소멸자 부분에서 에러가 나버리면.. 이전 1 2 다음 목록 더보기