Program Language/C++ 언어

12. C++ 생성자와 소멸자, 연산자 오버로딩

parkes811 2024. 6. 15. 20:34

 

  • C++ 생성자와 소멸자, 연산자 오버로딩

 

  • 생성자

- 정의 : 생성자는 클래스의 특별한 멤버 함수로, 객체를 초기화하는 역할을 합니다.

문법 :

class ClassName { public: ClassName(parameters); };
 

- 예제:

class Book { 
    public: Book(const string& title, int total_page); 
    private: string title_; 
    int total_page_; 
    int current_page_; 
    double percent_; 
    void set_percent(); 
}; 

Book::Book(const string& title, int total_page) { 
    title_ = title; 
    total_page_ = total_page; 
    current_page_ = 0; set_percent(); 
} 

void Book::set_percent() { 
    percent_ = (double)current_page_ / total_page_ * 100; 
} 

int main() { 
    Book web_book("HTML과 CSS", 350); 
    cout << web_book.percent_; 
    return 0; 
}

 

 

- 생성자의 종류:
  1. 기본 생성자: 매개변수가 없음.
  2. 매개변수 생성자: 매개변수를 받음.
  3. 복사 생성자: 다른 객체를 사용하여 초기화함.

추가 내용 :

  • 생성자는 클래스의 이름과 동일하며 반환형이 없습니다.
  • 생성자는 객체가 생성될 때 자동으로 호출됩니다.

  • 소멸자

- 정의: 소멸자는 객체가 소멸될 때 호출되는 클래스의 멤버 함수입니다.

- 문법:

class ClassName { 
    public: ~ClassName(); 
};

 

- 예제:

class Book { 
    public: ~Book(); 
}; 

Book::~Book() { 
    // 정리 작업 코드 
} 

int main() { 
    { 
       Book web_book("HTML과 CSS", 350); // Book 객체 생성 
    } 
    // Book 객체가 여기서 소멸되고, 소멸자가 호출됨 
    return 0; 
}

 

주요 포인트:

  • 소멸자는 매개변수가 없습니다.
  • 클래스당 하나의 소멸자만 가질 수 있습니다.
  • 메모리, 파일 핸들 등의 자원을 해제하는 데 사용됩니다.

추가 내용:

  • 소멸자는 클래스 이름 앞에 물결표(~)를 붙여서 선언합니다.
  • 소멸자는 객체가 범위를 벗어날 때 자동으로 호출됩니다.

  • 연산자 오버로딩

정의: 연산자 오버로딩은 사용자 정의 타입(클래스)과 함께 연산자가 작동하는 방식을 재정의할 수 있게 합니다.

예제:

class Complex { 
    private: float real; 
    float imag; 
    public: Complex() : real(0), imag(0) {} 
    Complex(float r, float i) : real(r), imag(i) {} 
    Complex operator + (const Complex& obj) { 
    Complex temp; 
    temp.real = real + obj.real; 
    temp.imag = imag + obj.imag; 
    return temp; 
} 
    
    void display() { 
    	cout << real << " + " << imag << "i" << endl; 
    } 
 }; 
    
 int main() { 
    Complex c1(3.0, 4.0), c2(1.0, 2.0), result; 
    result = c1 + c2; 
    result.display(); 
    return 0; 
 }

 

- 오버로딩 가능한 연산자 종류:

  • 산술 연산자 (+, -, *, /)
  • 관계 연산자 (==, !=, <, >)
  • 증가 및 감소 연산자 (++, --)
  • 스트림 삽입 (<<) 및 추출 (>>)

추가 내용:

  • 연산자 오버로딩은 객체 간의 연산을 보다 직관적으로 만들 수 있습니다.
  • 클래스 내에서 연산자를 정의할 때는 operator 키워드를 사용합니다.

추가 예제:

 
class Point { 
    private: int x, y; 
    public: Point(int x=0, int y=0) : x(x), y(y) {} 
    Point operator - (const Point& p) { 
    	return Point(x - p.x, y - p.y); 
    } 
    
    void display() { 
        cout << "(" << x << ", " << y << ")" << endl; 
    } 
}; 

int main() { 
    Point p1(10, 5), p2(3, 4), p3; 
    p3 = p1 - p2; p3.display(); 
    return 0; 
}

이 예제에서는 - 연산자를 오버로딩하여 두 Point 객체를 빼는 기능을 구현했습니다.