C++/Effective C++11 Effective C++ (21) ~ (25) 4. 설계 및 선언 21) 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 하지 말자 지역 객체에 대한 참조자를 반환해서는 절대로 안된다. 함수 내에서 생성된 지역 객체는 함수가 종료되자 마자 사라지기 때문이다. 그렇다면 객체를 힙에 생성해서 반환하는 것은 어떨까? 그러면 delete의 책임이 모호해진다. 최후의 방법으로 정적 객체의 참조자를 반환하는 것은 어떨까? 그러면 스레드 안정성 문제가 생기며 반환 식이 의도와 다르게 동작하는 경우가 왕왕 생긴다. 반환 값이 복사되는 것에 대해 너무 안타깝게 생각하지 말자. C++에서는 컴파일러가 일부 조건 하에 최적화 메커니즘을 통해 빠르게 동작할 수 있도록 만들어 줄 것이다. 22) 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 public.. 2021. 8. 16. Effective C++ (16) ~ (20) 3. 자원 관리 13) new와 delete를 사용할 땐 반드시 형태를 맞추자 delete에 []가 붙었는지 아닌지로 배열 요소를 삭제해야하는지 아닌지 결정되기 때문에 new를 썼다면 delete를, new[]를 썼다면 꼭 delete[]를 써주도록 하자. 또 헤깔릴 일이 없도록 배열 타입은 typedef로 정의할 때 주의하자. 14) new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 다음과 같은 코드는 컴파일되지 않는다. void processWidget(std::shared_ptr pw, int priority); // 호출 processWidget(new Widget, getPriority()); shared_ptr의 생성자는 explicit 키워드로 선언되어 있기 .. 2021. 8. 14. Effective C++ (11) ~ (15) 2. 생성자, 소멸자 및 대입 연산자 11) operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자 자기대입이란 어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것이다. Widget w; w = w; 별 문제가 없어보이지만 문제가 있다는 게 가장 큰 문제이다. 대입 연산자 내에서 어떤 동작을 할지 모르기 때문이다. 따라서 대입 연산자에서는 반드시 일치성 검사를 넣어 다음과 같이 구현해야 한다. Widget& Widget::operator=(const Widget& rhs) { if(this == &rhs) return *this; ... } 혹은 예외 안정성을 높인 다음과 같은 방법도 있다 Widget& Widget::operator=(const Widget& rhs) { Bitmap *.. 2021. 8. 12. Effective C++ (6) ~ (10) 2. 생성자, 소멸자 및 대입 연산자 6) #컴파일러가 만들어낸 함수가 필요 없다면 확실히 금지시키자 복사 생성자와 복사 대입 연산자는 사용자가 선언하지 않을 때에도 컴파일러가 자동으로 만들어내는 대표적인 두 함수이다. 이 둘의 사용을 금지하기 위해 반드시 private으로 선언하자. 이 때 매개변수 이름은 생략해도 되고, 이렇게 선언된 기본 클래스를 만들어 상속하도록 활용할 수도 있다. 7) 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 C++ 의 규정에 따르면, 기본 클래스 포인터를 통해 파생 클래스 객체가 삭제될 때, 소멸자가 비 가상으로 선언되어 있다면 미정의 동작이 발생한다. 이를 막기 위해 언제나 기본 클래스에는 소멸자를 가상으로 선언한다면, 어떤 포인터로 객체를 삭제.. 2021. 8. 9. Effective C++ (1) ~ (5) 시작하며 오랜만에 Effective C++를 다시 읽으려고 한다. 너무 옛날에 읽어서 기억이 안난다. 사실 그땐 이해도 거의 못했던 것 같다. 하루 다섯개씩 읽고 정리해서 11일동안 55개의 항목을 다 읽는게 목표다. 그다음엔 effective STL 읽어야지 1. C++에 왔으면 C++의 법을 따릅시다. 1) C++은 다양한 언어들의 조합이다. C++는 C, 객체지향, 템플릿, STL의 조합이라고 생각하면 된다. 언제나 통용되는 최고의 규칙이란 없다. C++의 어떤 부분을 어떤 상황에 사용하느냐에 따라 효과적인 선택지가 달라진다는 것을 명심하자. 2) #define을 사용해야 할 때에는 const, enum, inline을 떠올리자 #define은 전처리기로써 컴파일러에게는 전혀 보이지 않는다. (a).. 2021. 7. 31. 이전 1 2 다음 반응형