Confusing Term

 

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++에서 특정 함수나 연산자를 명시적으로 삭제하여, 사용자가 해당 함수를 호출하지 못하게 함

  1. 클래스가 특정 자원의 유일한 소유권을 가져야 하는 경우, 복사를 금지

     class UniqueResource {
     public:
         UniqueResource() = default;
    
         // 복사 생성자 및 복사 대입 연산자 삭제
         UniqueResource(const UniqueResource&) = delete;
         UniqueResource& operator=(const UniqueResource&) = delete;
    
         // 이동 생성자 및 이동 대입 연산자는 허용
         UniqueResource(UniqueResource&&) = default;
         UniqueResource& operator=(UniqueResource&&) = default;
    
         ~UniqueResource() = default;
     };
    
  2. 기본 생성자 금지

     class NoDefaultConstructor {
     public:
         NoDefaultConstructor(int x) : data(x) {}
    
         // 기본 생성자 삭제
         NoDefaultConstructor() = delete;
    
     private:
         int data;
     };
    
  3. 특정 오버로드 금지

     class Example {
     public:
         void func(int x) {
             std::cout << "Called func with int: " << x << std::endl;
         }
    
         // double을 인자로 받는 함수 삭제
         void func(double) = delete;
     };
    
  4. 연산자 금지

     class NonComparable {
     public:
         NonComparable(int x) : data(x) {}
    
         // 비교 연산자 삭제
         bool operator==(const NonComparable&) = delete;
         bool operator!=(const NonComparable&) = delete;
    
     private:
         int data;
     };
    

explicit