본문 바로가기

업무용 언어

C++11 살펴보기 C++11 C++11 설계 목표 C++ 핵심 언어 확장 핵심 언어 런타임 성능 향상 우측값 참조 및 이동 생성자 constexpr – 일반화된 상수 표현식 Plain Old Data(POD) 정의 변경 핵심 언어 빌드 타임 성능 향상 extern 템플릿 핵심 언어 사용성 개선 이니셜라이저 목록 std::initializer_list 단일 형태 초기화 {} 타입 추론 auto, decltype 범위 기반 for 반복문 람다 함수 및 표현식 []() -> T {} 선택적 함수 문법 (반환 타입 지정)auto () -> T {} 생성자 위임 명시적 override 및 final nullptr 강력한 형식의 열거형 enum class 오른쪽 꺽쇠 괄호 >> 명시적 변환 연산자 템플릿 별칭 무제한 공용 구조체 핵.. 더보기
[Exceptional C++ Style] 1. vector의 올바른 용법과 잘못된 용법 [Exceptional C++ Style] 1. vector의 올바른 용법과 잘못된 용법 질문 [1] vector v 가 주어졌다고 할 때, 아래의 줄 A와 B의 차이는 무엇일까? void f(vector& v) { v[0]; // A v.at(0); // B } [2] 다음 코드를 고찰하라. vector v; v.reserve(2); assert(v.capacity() == 2); v[0] = 1; v[1] = 2; for (vector::iterator i = v.begin(); i < v.end(); i++) { cout 더보기
[Effective C++] 항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 [Effective C++] 항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 객체 복사 막기 부동산과 관련된 다음과 같은 클래스가 있다고 가정해보자. class HomeForSale { ... }; 모든 자산은 세상에 하나 밖에 없기 때문에 위 클래스로 만들어지는 객체는 복사가 불가능하게 해야한다. HomeForSale home1; HomeForSale home2; HomeForSale home3(home1); // home1을 복사하려 한다. home1 = home2; // home2를 복사하려 한다. 일반적으로 어떠한 기능을 막고 싶다면, 그런 기능을 지원하는 함수를 선언하지 않으면 된다. 그러나 복사 생성자와 복사 대입 연산자는 컴파일러가 자동으로 만들어 내기 때.. 더보기
[Effective C++] 항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 [Effective C++] 항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 컴파일러가 자동으로 만들어내는 함수 비어 있는 클래스일지라도 컴파일러가 저절로 선언해 주는 멤버 함수들이 있다. 바로 복사 생성자, 복사 대입 연산자, 그리고 소멸자이다. 만약 생성자 조차도 선언되어 있지 않으면 기본 생성자까지 컴파일러가 만들어 낸다. 이들은 모두 기본형으로 public이며 inline 함수로 만들어 진다(항목 30 참조).따라서 다음과 같은 클래스는 class Empty { }; class Empty { public: Empty() { ... } // 기본 생성자 Empty(const Empty& rhs) { ... } // 복사 생성자 ~Empty() { ... } // 소멸자 Em.. 더보기
[C++11] 생성자 위임 [C++11] 생성자 위임 생성자 위임 (C++11) 아래와 같은 클래스를 가정해보자. class Foo { public: Foo(char x) : _x(x) { } Foo(char x, int y) : _x(x), _y(y) { } ... private: char _x; int _y; }; 여기에서는 데이터 멤버 수가 적기 때문에 크게 문제될 것이 없어 보이지만, 데이터 멤버가 늘어나면 날수록 멤버 초기화 리스트에 보이는 멤버들 수는 기하 급수적으로 늘어날 것이다. C++03 에서는 아래와 같은 방법들로 이를 해결했었다. 데이터 멤버에 기본 값을 넣을 수 있는 경우에. 기본 인자를 설정하여 여러 버전의 생성자를 만드는 방법 class Foo { public: Foo(char x, int y=0) : _.. 더보기
[Effective C++] 항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자 [Effective C++] 항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자 비멤버 객체 초기화 객체의 값을 초기화 하는데 있어 C++는 복잡한 규칙을 따른다. 아래와 같은 경우, int x; 어떤 상황에서는 x의 값은 0으로 확실히 초기화되지만, 또 다른 상황에서는 x의 값이 보장되지 않는다. 또한, class Point { int x, y; }; // ... Point p; p의 데이터 멤버 역시 어떤 상황에서는 초기화가 보장되지만, 또 어떤 상황에서는 초기화가 보장되지 않는다. 대부분의 경우, 객체의 내부가 무작위 비트로 된 이상한 값을 갖게 된다.C++의 객체 초기화는 나름대로의 규칙을 갖고 있지만, 이 규칙이 복잡하기 때문에 항상 초기화하는 습관을 들이는 것이 좋다. 비멤버 객체에 .. 더보기
[Effective C++] 항목 3. 낌새만 보이면 const를 들이대 보자! [Effective C++] 항목 3. 낌새만 보이면 const를 들이대 보자! 포인터와 const const 키워드는 들어갈 수 있겠다 싶은 곳이면 어디든 붙일 수 있다. 포인터 타입에 대해서는 포인터 자체를 상수로, 혹은 포인터가 가리키는 대상을 상수로, 혹은 둘 다 지정할 수 있고, 아무것도 지정하지 않을 수도 있다. char greeting[] = "Hello"; char* p = greeting; // 비상수 포인터, 비상수 데이터 const char* p = greeting; // 비상수 포인터, 상수 데이터 char* const p = greeting; // 상수 포인터, 비상수 데이터 const char* const p = greeting; // 상수 포인터, 상수 데이터 const 키워드.. 더보기
[Effective C++] 항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자 [Effective C++] 항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자 컴파일 타임 상수 대체하기 아래와 같은 define 문이 있을 때, #define ASPECT_RATIO 1.653 ASPECT_RATIO라는 이름은 심볼은 컴파일러에겐 전혀 보이지 않는다(컴파일러의 심볼 테이블에 들어가지 않음). 선행 처리자가 숫자 상수로 바꾸어 버리기 때문이다. 이 때문에 생길 수 있는 문제는 다음과 같다. 컴파일 에러가 발생하면 ASPECT_RATIO라는 심볼보다는 1.653이라는 상수를 마주하게 될 것이므로, 버그를 찾기가 어려워 진다. (더군다나 ASPECT_RATIO가 정의된 파일이 프로젝트 내에 있지 않을 경우, 찾기가 더욱 곤란해 질 수 있음) 심볼릭 디버거에서도.. 더보기
[Effective C++] 항목 1. C++를 언어들의 연합체로 바라보는 안목은 필수 [Effective C++] 항목 1. C++를 언어들의 연합체로 바라보는 안목은 필수 C++ 은 다중 패러다임 언어다. 절차적 프로그래밍 객체 지향 프로그래밍 함수형 프로그래밍 일반적 프로그래밍 메타프로그래밍 C++ 는 4개의 하위 언어로 구성되어 있다. C 언어: C++ 의 근간은 C 언어다. 블록, 문장, 선행 처리자, 기본 제공 데이터 타입, 배열, 포인터 등. 이들 중 상당수는 구식의 것이며 C++ 의 것으로 대체할 수 있는 방법을 활용하는 것이 좋다. 그러나 C++ 개발자라면 이들 개념에 대해 정확히 알고 있어야 할 것이다. 객체 지향 C++: 클래스(생성자와 소멸자), 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩) 등. 템플릿 C++: 일반화 프로그래밍 영역. 템플릿의 힘은 너무나도 강력.. 더보기