C_C++ 프로그래밍/Effective C++
-
[Effective C++] 7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자C_C++ 프로그래밍/Effective C++ 2019. 9. 8. 17:29
로재의 개발 일기 파생 클래스에 소멸자를 쓰면?? 다들 파생 클래스를 만들어보신 경험이 있을겁니다.이때 만약에 기반 클래스 포인터로 파생 클래스를 가리키게 된다면?파생 클래스의 소멸자가 정상적으로 작동할까요? 답은 아닙니다. 이번 항목에서는 virtual 소멸자 및 함수에 대해서 말하고 있습니다. nonVirtual.cpp 1234567891011121314151617181920212223242526272829303132333435363738394041#include class Base{ public: Base(){ std::cout
-
[Effective C++] 6. 컴파일러가 만들어낸 함수가 필요 없으면 이들의 사용을 금해 버리자C_C++ 프로그래밍/Effective C++ 2019. 9. 6. 22:51
로재의 개발 일기 컴파일러가 자동으로 생성 컴파일러는 필요에 따라서 생성자, 복사 생성자, 소멸자를 자동적으로 생성을 하게 됩니다.하지만 이를 막고 싶다면 어떻게 해야할까요? 이번 항목은 다음과 같이 제시하고 있습니다.1. 통상적으로 쓰였던 private (friend 접근은 막지 못합니다) 2. friend까지 막을 수 있는 기반 클래스 작성 private를 통해서 막아봅시다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960/* * Made person: rojae * Made date: 2019.09.06 * --- code description --..
-
[Effective C++] 5. C++이 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자C_C++ 프로그래밍/Effective C++ 2019. 9. 5. 19:18
로재의 개발 일기 C++이 자동으로 만들어주는 함수 우리들이 만드는 거의 모든 C++ 클래스에 한 개 이상 들어있는 것이 무엇일까요?바로 입니다. 하지만 다들 경험 해보셨을텐데요.딱히 작성을 하지 않아도 컴파일러가 알아서 작성을 해줍니다. 하지만 이 부분에서 의도치 않은 오류가 있을 수 잇습니다. 이번 항목은 그것을 말하고 있습니다. 자동으로 생성이 된다 빈 클래스를 작성을 해보았습니다. 이 클래스를 호출하고 복사 대입하는 코드를 구현해봤어요.1234567891011121314151617181920/* * Made person: rojae * Made date: 2019.09.05 * --- code description --- * 생성자, 소멸자, 복사 생성자가 저절로 생겨난다 */ #include c..
-
[Effective C++] 4. 객체를 사용하기 전에 반드시 객체를 초기화하자C_C++ 프로그래밍/Effective C++ 2019. 9. 3. 20:50
로재의 개발 일기 객체를 초기화하자 C++에서 어떠한 객체를 초기화를 진행했을때완벽하게 그것을 보장을 해줄 수도... 아닐 수도 있습니다. 예를 하나 들어볼까요?int x // 이 변수는 0으로 초기화가 거의 확정이죠. 하지만 다음과 같을 시에는 class Point {int x,y}....Point p; // Point p의 객체의 초기화가 보장되지 못합니다. 이번 항목에서는 다음과 같이 지시하고 있었습니다.1. 기본 제공 타입의 객체는 직접 초기화를 진행한다.(되는 경우도 있고 아닌 경우도 있지만 그냥 모두 초기화하자) 2. 생성자에서 대입을 통한 초기화가 아닌 초기화 리스트를 사용하여 진행하자 3. 여러 번역 단위에 존재하는 비지역 정적 객체들의 초기화 순서 문제를 피하기 위해서 설계하자 이는 비지..
-
[Effective C++] 3. 낌새만 보이면 const를 들이대 보자!C_C++ 프로그래밍/Effective C++ 2019. 8. 29. 16:30
로재의 개발 일기 constconst의 가장 큰 장점은 객체의 외부 변경을 불가능하도록 소스코드에 작성을 하면 컴파일러가 이를 반드시 지켜준다는 점입니다. 즉, 개발자 입장에서 의도치 않은 사용을 금지하거나, 그러한 의도를 소스코드에 보일 수 있다는 것 입니다. poiner const char name[] = "rojae"; // 문자열 선언 char *p = name; // 비상수 데이터, 비상수 포인터 const char* p = name; // 상수 데이터, 비상수 포인터 char* const p = name; // 비상수 데이터, 상수 포인터 const char* const p = name; // 상수 데이터, 상수 포인터 상수라는 단어가 들어가면 외부에서 변경이 불가능하다는 것입니다. 또한 vo..
-
[Effective C++] 2. #define을 쓰려거든 const enum, inline을 떠올리자.C_C++ 프로그래밍/Effective C++ 2019. 8. 28. 00:27
로재의 개발 일기 #define #include #ifdef #ifndef #include 는 현재 프로그래밍에서는 대체할 수는 있는 수단이 없고#ifdef #ifndef은 매우 유용하게 사용하는 수단입니다. 하지만, #define은 const, enum, inline 등등 매우 유용하게 쓰일 수 있는 수단이 있습니다. 즉 선행 처리자보다 컴파일러를 가까이 하자는 의미인데요.예를 들자면 #define PI = 3.14라고 한다면선행 처리자가 PI라고 작성된 소스코드를 모두 3.14로 선행 처리가 됩니다. 만약 이 부분에서 컴파일 오류나 논리 오류가 발생한다면?3.14라는 상수에서 오류가 검출이 되고 찾기 어렵겠죠?심지어 private 성격을 가지는 #define은 없습니다. const를 사용하자 #def..
-
[Effective C++] 1. C++를 언어들의 연합체로 바라보는 안목은 필수C_C++ 프로그래밍/Effective C++ 2019. 8. 26. 15:45
로재의 개발 일기 C++은 언어들의 연합체 c++을 잘 사용하기 위해서는 c++을 하나의 언어로 보기보다는c++을 하나의 연합체로 보는 것이 좋습니다.즉 c++이 여러 개의 하위 언어를 제공한다는 점을 제기하는 것입니다.그렇다고 막연한 이야기는 아닙니다. 4개 밖에 없기 때문이죠. 1. C C++은 여전히 C 기반이기 때문에, C만 쏙 빼서 사용이 가능합니다. 하지만, 이렇게 개발을 하기 된다면 효과적인 프로그래밍을 위한 규칙을 적용할 수 없게 됩니다. 템플릿도 없고, 예외도 없고, 오버로딩도 없고.... 등등 말입니다.. 2. 객체 지향 개념의 C++ '클래스를 사용하는 C'에 관한 이야기입니다. 생성자와 소멸자, 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩)까지 포함합니다. 3. 템플릿 C++ 요..