관리 메뉴

JIE0025

[C++] 생성자와 소멸자, 복사생성자 본문

기타 학습/Language

[C++] 생성자와 소멸자, 복사생성자

Kangjieun11 2022. 5. 17. 13:05
728x90

 

생성자

C++은 생성자를 이용해 

객체 생성과 동시에 멤버변수를 초기화 할수 있다. 

 

- 클래스 이름과 동일한 이름

- 반환형 명시 X

- 오버로딩 (여러번 정의가능, but 매개변수의 개수나 형태가 달라야 한다.)

class Monster{
private:
    int damage;
    string name;

public:
	
    Monster(){
    	//생성자
    }
};

 

기본 생성자

- class안에 별도의 생성자를 구현하지 않으면 기본생성자 default constructor 가 사용되며

멤버변수는 0이나 NULL등의 값으로 초기화 된다. 

 

복사 생성자

다른 인스턴스의 참조를 인수로 받아 자신의 인스턴스를 초기화 하도록 함

깊은 복사 : 기존의 인스턴스와는 다른 메모리 공간에 할당 됨 >> 독립적

 

#include<iostream>

using namespace std;

class FruitSeller {
private:
	int APPLE_PRICE;
	int numOfApples;
	int myMoney;

public:
	//this 키워드를 사용하지 않은 축약된 작성법
	FruitSeller(int price, int num, int money) : APPLE_PRICE(price), numOfApples(num), myMoney(money) {}

	//복사 생성자
	FruitSeller(const FruitSeller& seller) {
		APPLE_PRICE = seller.APPLE_PRICE;
		numOfApples = seller.numOfApples;
		myMoney = seller.myMoney;
	}
    	
       void ShowSaleResult() {
		cout << "남은 사과 :" << numOfApples << '\n';
		cout << "현재 돈 : " << myMoney << '\n';
	}

};
int main() {
	
	FruitSeller s1(1000, 100, 800);
	FruitSeller s2(s1);

	s2.ShowSaleResult();
	return 0;
}

 

 


소멸자 (Destructor)

 

수명이 끝난 객체를 제거하기 위함

- 수명이 끝난 객체를 자동으로 컴파일러가 소멸자 함수를 호출

- 클래스명과 동일하지만, ~기호를 사용해 생성자와 구분

 

#include<iostream>

using namespace std;

class FruitSeller {
private:
	int APPLE_PRICE;
	int numOfApples;
	int myMoney;

public:
	//this 키워드를 사용하지 않은 축약된 작성법
	FruitSeller(int price, int num, int money) : APPLE_PRICE(price), numOfApples(num), myMoney(money) {}

	//복사 생성자
	FruitSeller(const FruitSeller& seller) {
		APPLE_PRICE = seller.APPLE_PRICE;
		numOfApples = seller.numOfApples;
		myMoney = seller.myMoney;
	}

	~FruitSeller(){
     	cout << "FruitSeller 소멸" << endl;
     }
     	void ShowSaleResult(){ 
		cout << "남은 사과 :" << numOfApples << '\n';
		cout << "현재 돈 : " << myMoney << '\n';
	}
};
int main() {
	
	FruitSeller s1(1000, 100, 800);
	FruitSeller s2(s1);

	s2.ShowSaleResult();
	return 0;
}

 

 

소멸자는 생성자에서 할당한 리소스의 소멸에 사용된다.

만약 생성자에서  new를 이용해 할당한 메모리 공간이 있을 경우 소멸자에선 delete 연산자를 이용해 메모리 공간을 소멸 해준다.

#include<iostream>
#include <string>

using namespace std;

class FruitSeller {
private:
	int APPLE_PRICE;
	int numOfApples;
	int myMoney;
	string* myName;         

public:
	
	FruitSeller(string * name,int price, int num, int money) {
		APPLE_PRICE = price;
		numOfApples = num;
		myMoney = money;
		myName = name;
	}
	
	int SaleApple(int money) {
		int num = money / APPLE_PRICE;
		numOfApples -= num;
		myMoney += money;
		return num;
	}
	void ShowSaleResult() {
		cout << "판매자 : " << *myName << '\n';
		cout << "남은 사과 :" << numOfApples << '\n';
		cout << "현재 돈 : " << myMoney << '\n';
	}

	~FruitSeller() {
		//동적 할당 된 name delete
		delete [] myName;
		cout << "delete complete";
	}
};

int main() {
	
	string* name = new string("jieun");  // 위의 방식에서 여기만 다름
	FruitSeller s1(name,100, 200, 3000);
	s1.ShowSaleResult();

	return 0;
}

 


 

 

어제 너무 재밌게 놀았더니 글쓰던게 사라졌다.... 코드만 남아있음 ㅋㅋㅋㅋㅋ ㅠ

그래서 어쩔수 없이 이번 개념은 간단하게 적어버렸다. 

빨리 다음을 넘어가야하는 걸 어쩌겠어..>!