C++
-
[Effective C++] 생성자, 소멸자 및 대입 연산자프로그래밍 기초/C++ 2022. 6. 11. 14:46
생성자, 소멸자 및 대입 연산자 C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 기본적으로 생성되는 멤버 함수 개발자가 따로 생성하지 않으면 컴파일러에서 기본적인 모양으로 만드는 멤버 함수들이 존재한다. 생성자 인자가 없는 기본 생성자를 생성한다. 소멸자 아무 기능 없는 소멸자를 생성한다. 복사 생성자 복사가 가능한 경우 복사 생성자를 생성한다. 멤버가 참조형이거나 상수인 경우 복사가 불가능하다. 복사 대입 연산자 기본 클래스에서 복사 대입 연산자를 private으로 하지 않은 경우 복사 대입 연산자를 생성한다. ※ 복사 생성자와 복사 대입 연산자의 경우 생성이 불가능할 경우 컴파일 에러가 발생한다. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 private으로..
-
[Unreal 4] C++을 이용한 오브젝트 생성 정리게임 엔진/Unreal 2022. 6. 9. 21:58
언리얼 C++를 이용한 오브젝트 생성 생성자에서 오브젝트 생성 CreateDefaultSubobject를 사용하면 된다. USphereComponent* SphereComponent = CreateDefaultSubobject(TEXT("Root")); ※ 생성자 외부에서 이 함수를 사용하면 컴파일 에러가 발생한다. 생성자 외부에서 오브젝트 생성 NewObject로 생성하면 된다. 컴포넌트인 경우 RegisterComponent를 호출해 등록해줘야 한다. USphereComponent* SphereComponent = NewObject(this, TEXT("Root")); SphereComponent->RegisterComponent(); ※ 컴포넌트에 설정은 RegisterComponent 전에 해야 ..
-
[Effective C++] C++에 왔으면 C++의 법을 따릅시다프로그래밍 기초/C++ 2022. 6. 1. 10:31
C++에 왔으면 C++의 법을 따릅시다 #define을 쓰려거든 const, enum, inline을 떠올리자 클래스 범위에 상수 정의 클래스 범위에만 상수를 적용할 때는 정적(static) 멤버로 만드는 게 좋다. 이때, 헤더(.h 파일)에는 선언만 존재해야 하고 정의는 구현(.cpp 파일)에 들어가야 한다. ※ 클래스 컴파일 시 상수 값이 필요한 경우는 예외로 둔다. // CostEstimate.h class CostEstimate { static const double FudgeFactor; } // CostEstimate.cpp const double CostEstimate::FudgeFactor = 1.35; 나열자 둔갑술(enum hack) 클래스 컴파일 시 상수 값이 필요한 경우 상수 대신 ..
-
Effective C++...3일지 2022. 5. 31. 07:51
객체 사용 전 초기화 처리 객체 사용 전에는 항상 초기화 처리를 해 줘야 한다. C++에서 사용하는 C 부분은 객체를 초기화해준다는 보장이 없다. 어떤 게 초기화를 보장하고 어떤 게 그렇지 않은지 모두 외울 수 없으므로 항상 초기화를 해 줘야 한다. 멤버 초기화 리스트 사용 생성자 내에서 대입을 하는 대신 멤버 초기화 리스트로 초기화를 해주는 게 좋다. ABEntry::ABEntry(const std::string& name, const std::string& address) { theName = name; theAddress = address; // 이건 초기화가 아니라 대입이다. } ABEntry::ABEntry(const std::string& name, const std::string& addre..
-
Effective C++...2일지 2022. 5. 30. 08:51
포인터의 상수 처리 포인터는 const를 어디에 붙이는지에 따라 포인터를 상수 처리할지, 데이터를 상수 처리할지 달라진다. char greeting[] = "Hello"; char* p = greeting; // 비상수 포인터, 비상수 데이터 const char* p = greeting; // 비상수 포인터, 상수 데이터 char* const p = greeting; // 상수 포인터, 비상수 데이터 const char* const p = greeting; // 상수 포인터, 상수 데이터 ※ 값의 수정이 필요한 경우가 아니면 const를 붙여두면 추후 실수를 막을 수 있다. 상수 함수의 오버로딩 클래스의 함수는 상수 여부만으로 오버 로딩이 가능하다. class TextBlock { public: ... ..
-
Effective C++...1일지 2022. 5. 27. 08:09
클래스 범위에 상수 정의 클래스 범위에만 상수를 적용할 때는 정적(static) 멤버로 만드는 게 좋다. 이때, 헤더(.h 파일)에는 선언만 존재해야 하고 정의는 구현(.cpp 파일)에 들어가야 한다. ※ 클래스 컴파일 시 상수 값이 필요한 경우는 예외로 둔다. // CostEstimate.h class CostEstimate { static const double FudgeFactor; } // CostEstimate.cpp const double CostEstimate::FudgeFactor = 1.35; 나열자 둔갑술(enum hack) 클래스 컴파일 시 상수 값이 필요한 경우 상수 대신 enum을 선언하여 사용할 수 있다. ※ enum은 쓸데없는 쓸데없는 메모리 할당이 발생하지 않는다. class..
-
[C++ 14] 제네릭 프로그래밍 / 추가된 기능과 기억해야 할 내용프로그래밍 기초/C++ 2022. 5. 26. 11:00
제네릭 프로그래밍 함수 템플릿 타입 결정 방법 = 대부분의 경우 암묵적으로 잘 변환되나 int와 unsigned 같이 모호한 경우 명시적으로 결정해 줘야 한다. template TPara max(TPara a, TPara b) { return a > b ? a : b; } unsigned u1 = 2; int i = 3; max(u1, i); // 에러 발생! max(int(u1), i); // Ok max(u1, i); // Ok 자동 리턴 타입 + 컴파일러에서 리턴 타입도 추론이 가능하게 되었다. template inline auto max(T a, U b) { return a > b ? a : b; } 네임 스페이스 네임 스페이스 한정 = 네임 스페이스로 특정 클래스, 변수 등을 선택해 사용할 수 ..
-
[C++ 14] 클래스 / 추가된 기능과 기억해야 할 내용프로그래밍 기초/C++ 2022. 5. 22. 11:32
클래스 생성자 = 단일 인수를 가지는 생성자는 대입 연산자로 생성해도 오버헤드가 발생하지 않는다. class complex { public: complex(double r = 0, double i = 0) : r(r), i(i) {} // ... } complex z4 = 4; // 과거에는 임시 변수를 생성해 오버헤드가 발생한다고 했으나 최신 컴파일러는 문제없이 최적화한다. = 생성자가 여러 개 일 때 다른 생성자를 불러 초기화하는 것을 허용한다. class complex { public: complex(double r, double i) : r{r}, i{i} {} complex(double r) : complex{r, 0.0} {} complex() : complex{0.0, 0.0} {} // ...