일지
-
Effective C++...27일지 2022. 7. 19. 08:18
예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 예외 안전성을 가진 함수의 동작 예외 안전성을 가진 함수는 다음과 같이 동작해야 한다. 자원이 새지 않도록 만든다. 자료구조가 더럽혀지는 것을 허용하지 않는다. 다음의 예제의 new Image(imgSrc)에서 에러가 발생하면 이 동작이 모두 정상적으로 작동하지 않는다. class PrettyMenu { public: ... void changeBackground(std::istream& imgSrc); // 이미지 변경 함수 ... private: Mutext mutext; Image* bgImage; // 현재 배경 int imageChanges; // 이미지 변경 횟수 } void PrettyMutext::changeBackground(std::..
-
Effective C++...26일지 2022. 7. 18. 08:59
내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자 함수의 반환형에 의해 캡슐화 변동 기본적으로 멤버 변수를 private으로 선언했다고 하더라도 public함수가 해당 멤버 변수를 참조형 또는 포인터로 반환한다면 이 멤버 변수는 public으로 봐야 한다. 즉, 객체의 내부 요소는 함수의 핸들 반환 시에도 캡슐화의 정도가 달라지게 된다. 다음과 같이 사각형을 나타내는 클래스가 있을 때 사용자가 사각형의 정보를 볼 수 있게 하기 위해 참조형을 반환한다면 반환된 값을 통해 수정될 수 있는 위험이 있다. struct RectData { Point ulhc; Point lrhc; }; class Rectangle { ... private: std::tr1::shared_ptr pData; ..
-
JUNGOL...192일지 2022. 7. 17. 12:06
Intermediate_Coder/그래프탐색-BFS/보물섬 문제 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 이동은 상하좌우로 이웃한 육지로만 가능하며, 한 칸 이동하는데 한 시간이 걸린다. 보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다. 육지를 나타내는 두 곳 사이를 최단 거리로 이동하려면 같은 곳을 두 번 이상 지나가거나, 멀리 돌아가서는 안된다. 예를 들어 위와 같이 지도가 주어졌다면 보물은 아래 표시된 두 곳에 묻혀 있게 되고, 이 둘 사이의 최단 거리로 이동하는 시간은 8시간이 된다. 보물 지도..
-
Effective C++...25일지 2022. 7. 15. 09:03
캐스팅은 절약, 또 절약! 잊지 말자 C++의 캐스팅 방법 C++ 에는 C 버전의 구형 스타일 캐스트와 C++ 버전의 신형 스타일 캐스트가 존재한다. 구형 스타일 캐스트 C 스타일 (T) 표현식 T(표현식) 신형 스타일 캐스트 C++ 스타일 const_cast(표현식) 객체의 상수성을 없애는 용도 dynamic_cast(표현식) 안전한 다운 캐스팅에 사용, 런타임 비용이 굉장히 높다. reinterpret_cast(표현식) 하위 수준 캐스팅에 사용, 일반적으로 사용되지 않는다. static_cast(표현식) 암시적 변환을 강제로 진행할 때 사용 신형 스타일의 캐스트는 다음과 같은 장점이 있다. 코드를 읽을 때 알아보기 쉽기 때문에 타입 시스템이 망가졌을 때 디버깅이 쉽다. 목적을 좁혀서 캐스팅하기 때문에..
-
Effective C++...24일지 2022. 7. 14. 08:51
변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 변수 사용 비용과 문제가 되는 부분 객체는 생성될 때와 범위를 벗어나 소멸될 때 각각 생성자와 소멸자를 호출하는 비용이 고정적으로 발생한다. 따라서 다음과 같은 경우에는 사용하지도 않을 객체의 생성, 소멸 비용을 지불하고 있게 된다. std::string encryptPassword(const std::string& password){ using namespace std; string encrypted; // encrypted를 사용하기도 전에 함수를 벗어날 가능성이 존재한다. if (password.length() < MinimumPasswordLength) { throw logic_error("Pssword is too short"); } re..
-
Effective C++...23일지 2022. 7. 12. 07:47
예외를 던지지 않는 swap에 대한 지원도 생각해 보자 표준 라이브러리 swap의 동작 표준 라이브러리에 있는 swap은 다음과 같이 구현되는데, 한 번 호출에 복사가 세 번 일어난다. namespace std { template void swap(T& a, T& b) { T temp(a); a = b; b = temp; } } 일반적으로는 표준 라이브러리의 swap으로 충분하지만 대부분의 멤버가 포인터로 구성되어 있는 경우라면 복사 생성자를 호출하는 대신 포인터가 가리키는 대상만 바꿔주는 편이 더 효율적이므로 이런 경우엔 전용 swap을 구현하는 게 좋다. 전용 swap 구현 방법 전용 swap을 구현할 때는 다음과 같은 구현이 필요하다. public 멤버 함수 swap 두 객체의 값을 맞바꾸는 예외를..
-
Effective C++...22일지 2022. 7. 5. 09:08
멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자 비멤버 비프렌드 함수를 사용해야 하는 이유 어떤 클래스의 private 멤버 부분을 접근할 권한이 없는 함수이기 때문에 코드의 복잡도를 늘리지 않는다. 비멤버 비프렌드 함수를 사용하는 방법 여러 방법이 존재하지만 대표적으로 다음의 방법이 존재한다. 같은 헤더의 전역 함수로 사용 가장 단순하지만 필요한 함수를 찾기 어려울 수 있다. 정적 클래스의 정적 함수로 사용 관련된 모든 내용을 하나의 클래스에서 작성해야 하는 문제가 있다. 네임 스페이스 내에서 전역 함수로 사용 필요한 내용의 구분이 가능하고 쉽게 확장할 수 있다. ※ 멤버 함수의 반대는 프렌드 함수가 아니라 비멤버 함수이다. 더보기 참고문헌 스콧 마이어스.(2015.03.26).이펙티브 C++
-
JUNGOL...191일지 2022. 7. 4. 21:17
Intermediate_Coder/그래프탐색-BFS/보물섬 문제 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 이동은 상하좌우로 이웃한 육지로만 가능하며, 한 칸 이동하는데 한 시간이 걸린다. 보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다. 육지를 나타내는 두 곳 사이를 최단 거리로 이동하려면 같은 곳을 두 번 이상 지나가거나, 멀리 돌아가서는 안된다. 예를 들어 위와 같이 지도가 주어졌다면 보물은 아래 표시된 두 곳에 묻혀 있게 되고, 이 둘 사이의 최단 거리로 이동하는 시간은 8시간이 된다. 보물 지도..