멤버 함수가 멤버 변수들을 수정하지 않는다면 const 로 선언하는 것이 자연스럽다. 그런데 스레드를 사용한다면 문제가 생길 수 있다. 예시를 통해 살펴보자. mutex의 사용 다음은 다항식의 근을 구는 함수 roots 를 구현하는 상황이다. 성능 향상을 위해 캐싱을 이용하였으며, rootsAreValid 의 값을 이용하여 캐싱 여부를 판별하는 함수이다. class Polynomial { public: using RootsType = std::vector; RootsType roots() const { if(!rootsAreValid) { ... rootsAreValid = true; } } private: mutable bool rootsAreValid{ false }; mutable RootsType..
서론 noexcept 를 이해하기 전에 C 와 C++ 의 특징에 대해서 알고가는 것이 좋을것 같아 작성한다. C 는 하드웨어를 작성하기 위해 만들어진 언어이다. 그러다보니 프로그래머에게 많은 자유를 주어진다. 예를 들어 다른 언어와 다르게 메모리를 직접 관리할 수 있으며, 하드웨어 제어 또한 가능하다. 대신에 그로 인해 발생하는 댕글링 포인터와 같은 문제에 대해서는 책임지지 않는다. 이러한 특성이 C++ 에도 전달되어서인지 예외에 대한 책임은 온전히 프로그래머의 몫이다. 그로인한 특성으로 try catch 문이 문법으로 존재함에도 STL에서 try catch 문을 사용하지 않는다. 또한 예외에 대해 변경이 생긴다면 기존에 존재하던 프로그램에 문제를 일으킬 수 있다는 이유로 try catch 문과 같은 예..
C++11에 오면서 override라는 키워드가 생겼다. java를 해본 사람이라면 @override라는 어노테이션을 본 사람이 있을 것이다. 이 어노테이션은 컴파일러에게 오버라이된 함수라는 것을 알려줘서 부모 클래스으로 부터 상속 받을 함수가 없다면 컴파일시에 알려준다. C++에서도 override 키워드가 똑같은 역할을 한다. 오버라이드 키워드를 만족하는 조건은 다음과 같다. 기반 클래스 함수가 반드시 가상 함수이어야 한다. 기반 함수와 파생 함수의 이름이 반드시 동일해야 한다(단, 소멸자는 예외). 기반 함수와 파생 함수의 매개변수 형식들이 반드시 동일해야 한다. 기반 함수와 파생 함수의 const성이 반드시 동일해야 한다. 기반 함수와 파생 함수의 반환 형식과 예외 명세가 반드시 호환되어야 한다...
제목만 보면 내용이 어려워보일수 있는데 사실은 어렵지 않다. 다시 정리해보면 private 를 이용해 함수를 숨기지 말고 delete 키워드를 사용하라는 의미이다. 이렇게 고의적으로 함수를 없애는 경우는 우리가 많이 사용하는 싱글턴이나 팩토리 패턴들을 사용하는 경우이니 알아두는것이 좋다. 어떻게 다른지 예제를 보자. class MyObject { // private을 사용하는 경우 private: MyObject(); // delete 키워드를 사용하는 경우 public: MyObject() = delete; }; 여기서 delete 키워드를 사용한 경우에 public으로 사용한 것을 볼 수 있는데 이는 의도적으로 더 나은 오류 메시지를 받기 위함임을 알아두길 바란다. 위의 두 코드의 목적은 똑같다. 외..
객체를 생성하는 방법은 생각보다 다양하다. 아래와 같은 방법이 존재한다. int x(0); int y = 0; int z{ 0 }; int z = { 0 }; 위의 4가지 방법 모두 똑같은 결과를 나타낸다. 그 중에서 중괄호({})로 나타낸 생성 방법을 바로 균일 초기화(uniform initialization)이라고 한다. 균일 초기화 도입 배경 균일 초기화라고 부르는 이유는 어떤 상황에서든 균일하게 초기화를 할 수 있기 때문이다. 균일 초기화를 도입하게 된 3가지 배경을 먼저 알아보자. 컨테이너 초기화 vector와 같이 배열의 경우 초기 값들을 지정할 수 있다. std::vector v{ 1, 3, 5 }; // v의 원소는 1, 3, 5 멤버 초기화 non-static 자료 멤버를 초기화 하는데 ..
이전 포스트에서는 auto 를 써야하는 이유를 보았다면 이번 글에서는 auto 를 사용할 때, 주의해야하는 점을 알아보도록 하자. std::vector::reference vector::reference 가 무엇인지 아는 사람은 드물것이다. 먼저 vector 에 대해 생각해보자. bool 형식을 원소로 갖는 배열을 의미한다. 여기서 bool 의 특징을 생각해보자. bool 은 true, false 만 저장하는데도 속도를 위해 1byte 의 크기를 갖고 있다. 그런데 우리는 bool 배열을 사용할 것이기 때문에 굳이 1byte만 사용하지 않아도 된다. 1bit에 1개의 원소를 저장해도 아무런 문제가 없다. 이를 bool 처럼 사용하게 해주는 컨테이너가 바로 vector::reference 이다. 여기서 a..
처음 C++ 에서 auto 라는 키워드를 알게 되었을 때, 'auto가 있어서 편하다' 라는 생각보다는 왜 필요한지 의문이 든 적이 있을 것이다. 타입을 알아서 지정해준다는 장점 하나만으로 쓰기에는 auto를 사용함으로써 타입을 알아내기 힘들다는 생각이 들게된다. 대표적으로 처음 javascript 나 python 을 사용하게 되면 타입을 알지 못해 생기는 귀찮은 일들이 생긴다. 그러나 auto 는 이를 감수할 충분한 가치가 있다. 어떠한 장점들이 있는지 알아보자. 초기화를 빼먹는 실수 종종 생길 수 있는 실수로 선언만하고 초기화를 하지 않는 경우가 생길 수 있다. 이런 실수 때문에 예상치 못한 문제들이 발생할 수 있어 항상 조심해야한다. 그런데 만약 auto를 사용했다면 컴파일러가 에러를 발생시켜 실수..
이번 항목에서는 연역된 형식이 무엇인지 궁금할 때, 형식을 알아내는 방법에 대해서 소개한다. 예를 들면 auto를 사용하는 경우인데 이를 알아내기란 쉽지가 않다. 이 책에서는 형식을 알아낼 수 있는 3가지 방법을 소개했다. IDE 편집기 컨파일러의 진단 메시지 실행시점 출력 IDE 편집기 좋은 IDE를 사용하고 있다면 현재 연역된 형식이 무엇인지 알려준다. 일반적으로 타입에 마우스를 올려두기만 하면된다. 그러나 복잡한 형식에서는 IDE가 알려주지 못할 수도 있다. 컨파일러의 진단 메시지 decltype 과 template 을 이용해서 컨파일러 에러를 통해 알아내는 방법이다. 방법은 다음과 같다. template class TD; TD xType; // 컴파일 에러 TD yType; // 컴파일 에러 xT..
- Total
- Today
- Yesterday
- Future
- detach
- CPP
- async
- 발아시기
- Unreal
- 포인터
- auto
- 람다
- Forwarding
- MOVE
- Join
- C++14
- Effective Modern C++
- thread
- Perfect
- 다이소
- Effective
- forward
- Modern
- std::move
- Overloading
- C
- const
- Override
- 보편 참조
- 보편참조
- C++11
- C++
- std::forward
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |