C++

    C++ STL (뇌를 자극하는) - 4장. 함수 템플릿 (Section 2 ~ 3)

    ※ 제가 개인적으로 공부하는 것이라 요약하거나 책에서 빠진 내용이 있을 수 있습니다 ※Section 2. 함수 템플릿클래스 템플릿은 클래스를 만들어내는 틀(메타 코드)다. 함수 템플릿과 별반 다를게 없다. 단지 함수에서 클래스 바뀐 것 뿐. 클래스 템플릿을 설명하기 위한 정수형 배열을 추상화한 클래스 Array를 최소의 기능만을 갖게 만들어봅니다.정수형 Array 클래스#include using namespace std;class Array{ int* buf; int size; //원소의 개수 int capacity; //저장 가능한 메모리 크기 public: explicit Array(int cap = 100) : buf(0), size(0), capacity(cap)..

    C++ STL (뇌를 자극하는) - 4장. 함수 템플릿 (Section 1)

    ※ 제가 개인적으로 공부하는 것이라 요약하거나 책에서 빠진 내용이 있을 수 있습니다 ※Section 1. 함수 템플릿템플릿은 두 종류가 있다1. 함수 템플릿 : 여러 함수를 만들어내는 함수의 틀2. 클래스 템플릿 : 여러 클래스를 만들어내는 클래스의 틀예제templatevoid Print(T a, T b){ cout (0.123, 1.123); // 명시적 호출}템플릿 함수를 사용하면 컴파일러는 클라이언트(호출 측)의 함수 호출 인자 타입을 보고 템플릿 함수의 매개변수 타입을 결정하여 실제 함수인 템플릿 인스턴스 함수를 만들어낸다. (참고로 컴파일 타임에 이루어진다)또한, 컴파일이 완료되면 함수 템플릿 (원본 함수 템플릿 자체)는 존재하지 않고 인스턴스화된 실제 함수들만 존재하게 된다. 템플릿도 함..

    C++ STL (뇌를 자극하는) - 3장. 함수 객체란

    ※ 제가 개인적으로 공부하는 것이라 요약하거나 책에서 빠진 내용이 있을 수 있습니다 ※Section 1. 함수 객체란함수 객체(Function Object)란 함수처럼 동작하는 객체. 객체가 '()' 연산자를 정의해야 하므로 '()' 연산자를 오버로딩한 객체다. 함수 객체는 함수자(Functor)라고도 불린다.함수 객체 정의 예시struct Functor{ void operator() () { cout "함수 객체!" 출력}functor는 객체지만 함수(functor())처럼 호출 가능. 매개변수를 갖는 함수 객체도 가능. operator() (int a, int b) -> functor(10, 20); 함수 객체의 장점함수처럼 동작하는 객체이므로 다른 멤버 변수와 멤버 함수를 가질 ..

    C++ STL (뇌를 자극하는) - 2장. 함수 포인터

    ※ 제가 개인적으로 공부하는 것이라 요약하거나 책에서 빠진 내용이 있을 수 있습니다 ※Section 1. 함수 포인터란변수 : 값을 저장하는 메모리 공간의 이름포인터 : 주소를 저장하는 메모리 공간의 이름함수 포인터 : 함수의 시작 주소를 저장하는 포인터 함수 포인터는 함수 시그니처(반환 타입과 매개변수 리스트)와 같게 선언한다. 예를 들어, int func(int a, int b)인 함수의 함수 포인터는 (*pf)(int, int)로 선언.함수 포인터의 선언과 사용 예제void Print(int n){ cout Print, pf, *pf의 출력 모두 같은데 Print가 함수의 시작 주소이고, pf도 함수의 시작 주소이고, 메모리 접근 연산자(*)를 pf에 붙여도 마찬가지로 함수의 주소여서 다 같은..

    C++ STL (뇌를 자극하는) - 1장. 연산자 오버로딩 (Section 6~7)

    ※ 제가 개인적으로 공부하는 것이라 요약하거나 책에서 빠진 내용이 있을 수 있습니다 ※Section 6. STL에 필요한 주요 연산자 오버로딩함수 호출 연산자 오버로딩은 객체를 함수처럼 동작하게 하는 연산자입니다. C++에서 Print(10)이라는 함수 호출 문장은 다음 세 가지로 해석할 수 있습니다.1. 함수 호출 : Print가 함수 이름2. 함수 포인터 : Print가 함수 포인터3. 함수 객체 : Print가 함수 객체struct FuncObject{public: void operator() (int arg) const { cout 예제 1-17 정수를 저장하는 간단한 Array 클래스class Array{ int *arr; int size; int capacity; ..

    C++ STL (뇌를 자극하는) - 1장. 연산자 오버로딩

    ※ 제가 개인적으로 공부하는 것이라 요약하거나 책에서 빠진 내용이 있을 수 있습니다 ※Section 1. 연산자 오버로딩이란C++에서 제공하는 클래스 타입, 즉 사용자 정의 타입에서도 연산자를 사용할 수 있게 하는 문법이다.// 사용자가 정의한 코드class Point{ ...}; int n1 = 10, n2 = 20; 같은 경우 n1 + n2는 컴파일러에 연산이 정의되어 있어서 가능하지만 Point p1 + p2를 생으로 하려면 정의되지 않아서 연산이 불가능하다. 그래서 연산자 오버로딩을 쓰면 정의되지 않은 타입도 연산이 가능하고 코드 직관성, 가독성을 올려준다. Section 2. 연산자 오버로딩 및 정의하기Point 클래스에서 연산자 + 정의 예제#include using namespace std;..

    Effective C++ 공부 (항목 11 ~ 15)

    Effective C++ 요약 (항목 11~15)항목 11: operator=에서는 자기 대입에 대한 처리를 빠뜨리지 말자문제점arr[i] = arr[j];*px = *py;위 연산들에는 자기 대입(self-assignment)의 가능성이 있음.단순히 delete 후 new로 처리할 경우 자기 대입 시 이미 지워진 데이터를 참조하게 될 수 있음.안전한 방법Widget& Widget::operator=(const Widget& rhs) { if (this == &rhs) return *this; Bitmap* pOrig = pb; pb = new Bitmap(*rhs.pb); // 복사 성공 시에만 교체 delete pOrig; return *this;}복사 먼저 → delet..

    Effective C++ 공부 (항목 6 ~ 10)

    Effective C++ 요약 (항목 6~10)항목 6: 컴파일러가 만들어주는 함수를 원치 않으면 명시적으로 금지하라컴파일러는 특별한 요청이 없어도 복사 생성자와 대입 연산자를 자동으로 생성한다. 하지만 어떤 객체는 복사되면 안 되는 경우가 있다.이럴 땐 다음처럼 private으로 선언하고 구현하지 않기:class A {private: A(const A&); A& operator=(const A&);};이러면 외부 복사가 불가능해진다. 만약 friend 함수가 사용하면 컴파일은 되지만 링커 오류 발생.현대적 방법 (C++11 이후):class A {public: A(const A&) = delete; A& operator=(const A&) = delete;};가독성, 유지보수성 증..