c++ 생성자와 소멸자

‍정진철·2022년 9월 4일
0

C++

목록 보기
8/18

출처 : 윤성우의 열혈 c++ 프로그래밍

생성자의 이해

  • 지금까지는 객체를 생성하고 객체의 멤버변수를 초기화 목적으로 InitMembers 라는 함수를 정의,호출 하였다.
  • 하지만 '생성자' 사용시 객체도 생성과 동시에 초기화 가능.

생성자 조건

  • 1 - 클래스의 이름과 함수의 이름이 동일.
    2 - 반환형이 선언되지 않으며 실제로 반환하지 않는다.

예시

#include <iostream>
using namespace std;

class SimpleClass
{
private:
    int num;

public:
    SimpleClass(int n) //생성자
    {
        num = n ;
    }
    int GetNum() const
    {
        return num;
    }
    
};

// 생성자 생성 전 객체 생성 방법
SimpleClass sc;
SimpleClass *ptr = new SimpleClass;

// 생성자 생성 후 객채 생성 방법 (인자의 정보 추가 필요)
SimpleClass sc(20);
SimpleClass *ptr = new SimpleClass(30);

#include <iostream>
using namespace std;

class FruitSeller
{
private:
    int APPLE_PRICE;
    int numOfApples;
    int myMoney;
public:
    FruitSeller (int price, int num , int money)
    {
        APPLE_PRICE = price;
        numOfApples = num;
        myMoney = money;
    }
    int SalesQAppels(int money)
    {
        int num = money/APPLE_PRICE;
        numOfApples -= num;
        myMoney += money;
    }
    
};

class FruitBuyer 
{
private:
    int myMoney;
    int numOfApples;

public: 
    FruitBuyer(int money)
    {
        myMoney = money;
        numOfApples = 0;
    }
    void BuyApples(FruitSeller &seller , int money)
    {
        numOfApples += seller.SalesQAppels(money);
        myMoney -= money;
    }
};

int main(void)
{
    FruitSeller seller(2000, 20, 0);
    FruitBuyer buyer(5000);
    buyer.BuyApples(seller, 2000);

    return 0 ;

}

멤버 이니셜라이저를 이용한 멤버 초기화

  • Point 헤더파일에 생성자 추가
#include <iostream>

using namespace std;

class Point
{
private:
    int x;
    int y;

public:
    Point(const int &xpos, const int &ypos) // 생성자
    int GetX() const;
    int GetY() const;
    bool SetX(int xpos);
    bool SetY(int ypos);
};

  • Point.cpp 생성자 추가
#include <iostream>
#include "Point.h"
using namespace std;

Point :: Point(const int &xpos, const int &ypos)
{
    x = xpos;
    y = ypos;
}
// Get 함수는 '반환' Set 함수는 '저장'
int Point ::GetX() const // const 함수
{
    return x;
}

int Point ::GetY() const
{
    return y;
}

bool Point::SetX(int xpos)
{
    if (xpos < 0 || xpos > 100)
    {
        cout << "잘못된 값 전달" << endl;
        return false;
    }
    x = xpos;
    return true;
}

bool Point::SetY(int ypos)
{
    if (ypos < 0 || ypos > 100)
    {
        cout << "잘못된 값 전달" << endl;
        return false;
    }
    y = ypos;
    return true;
}
  • Rectangle. h 생성자 추가
#include "Point.h"

class Rectangle
{
private:
    Point upLeft;
    Point lowRight;

public:
    Rectangle(const int &x1 , const int &y1, const int &x2, const int &y2);
    void ShowRecInfo() const;
};
  • Rectangle.cpp 생성자 추가

: upleft (x1, y1) , lowRight(x2,y2)

  • "객체 upLeft의 생성과정에서 x1과 y1을 인자로 전달받는 생성자를 호출하라."
  • 객체 lowRight의 생성과정에서 x2와 y2을 인자로 전달받는 생성자를 호출하라."
#include <iostream>
#include "rectangle.h"

using namespace std;

Rectangle::Rectangle(const int &x1, const int &y1, const int &x2, const int &y2)
    : upLeft(x1, y1), lowRight(x2, y2)
{
}

void Rectangle::ShowRecInfo() const
{
    cout << "좌 상단: " << '[' << upLeft.GetX() << ",";
    cout << upLeft.GetY() << ']' << endl;
    cout << "우 하단: " << '[' << lowRight.GetX() << ",";
    cout << lowRight.GetY() << ']' << endl;
}

" 멤버 이니셜라이저는 멤버변수로 선언된 객체의 생성자 호출에 활용된다. "


profile
WILL is ALL

0개의 댓글