constexpr
컴파일 타임에 변수의 값을 알 수 있으면 constexpr 사용 (좋은 설명)
constexpr int a = 10;
constexpr int b = 5;
// constexpr이 붙은 함수는 컴파일러가 직접 컴파일 시간에 모든 값을 미리 계산한다
constexpr int fibonacci(const int n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
default
class MyClass {
public:
MyClass() = default; // 컴파일러가 자동으로 기본 생성자를 생성
MyClass(const MyClass&) = default; // 컴파일러가 자동으로 복사 생성자를 생성
MyClass(MyClass&&) = default; // 이동 생성자
MyClass& operator=(MyClass&&) = default; // 이동 대입 연산자
};
언제 = default를 사용하지 말아야 할까?
-
클래스가 포인터나 자원 관리를 수행하는 경우: 클래스가 동적 할당된 자원을 소유하고 있다면, 기본 복사 생성자나 이동 생성자를 사용하는 것은 위험할 수 있다. 이 경우, 자원을 제대로 관리하기 위해 직접 생성자나 대입 연산자를 정의해야 한다.
-
특정 생성자나 연산자가 필요 없는 경우: 어떤 클래스는 복사 생성자나 이동 생성자가 필요하지 않을 수 있다. 이럴 때는 = delete를 사용하여 해당 동작을 금지하는 것이 좋다.
delete
C++에서 특정 함수나 연산자를 명시적으로 삭제하여, 사용자가 해당 함수를 호출하지 못하게 함
-
클래스가 특정 자원의 유일한 소유권을 가져야 하는 경우, 복사를 금지
class UniqueResource { public: UniqueResource() = default; // 복사 생성자 및 복사 대입 연산자 삭제 UniqueResource(const UniqueResource&) = delete; UniqueResource& operator=(const UniqueResource&) = delete; // 이동 생성자 및 이동 대입 연산자는 허용 UniqueResource(UniqueResource&&) = default; UniqueResource& operator=(UniqueResource&&) = default; ~UniqueResource() = default; };
-
기본 생성자 금지
class NoDefaultConstructor { public: NoDefaultConstructor(int x) : data(x) {} // 기본 생성자 삭제 NoDefaultConstructor() = delete; private: int data; };
-
특정 오버로드 금지
class Example { public: void func(int x) { std::cout << "Called func with int: " << x << std::endl; } // double을 인자로 받는 함수 삭제 void func(double) = delete; };
-
연산자 금지
class NonComparable { public: NonComparable(int x) : data(x) {} // 비교 연산자 삭제 bool operator==(const NonComparable&) = delete; bool operator!=(const NonComparable&) = delete; private: int data; };
explicit
PREVIOUSBasics
NEXTInheritance