일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링
- 백준 알고리즘
- 코딩교육봉사
- 자바
- kotlin
- 공부일지
- 회고
- CJ UNIT
- 1과목
- java
- 백준
- SQL
- 백준알고리즘
- softeer
- SW봉사
- programmers
- 데이터베이스
- 시나공
- C++
- python
- 정보처리산업기사
- 파이썬
- 코틀린
- 소프티어
- 알고리즘
- 문제풀이
- 코딩봉사
- BFS
- 프로그래머스
- MYSQL
Archives
- Today
- Total
JIE0025
[C++] 생성자와 소멸자, 복사생성자 본문
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;
}
어제 너무 재밌게 놀았더니 글쓰던게 사라졌다.... 코드만 남아있음 ㅋㅋㅋㅋㅋ ㅠ
그래서 어쩔수 없이 이번 개념은 간단하게 적어버렸다.
빨리 다음을 넘어가야하는 걸 어쩌겠어..>!
'기타 학습 > Language' 카테고리의 다른 글
[ C++ ] 객체 배열, 객체 포인터 배열 (0) | 2022.05.17 |
---|---|
[ C++ ] 이니셜라이저를 이용한 멤버 초기화 (0) | 2022.05.17 |
[ C++ ] 객체지향 프로그래밍의 개념, 정보은닉과 캡슐화 (0) | 2022.05.16 |
[C++] 클래스(class), 객체(Object) (0) | 2022.05.11 |
[C++] 구조체 (0) | 2022.05.10 |