생성자
(constructor)라는 특별한 멤버 함수를 통해 객체를 초기화 함class Circle {
....
Circle(); // 정상적인 생성자 선언.
void Circle(int r); // 컴파일 오류. 생성자는 리턴 타입 없음
int Circle(double r); // 컴파일 오류. 생성자는 리턴 타입 없음
....
};
Circle::Circle() {
...
return; // 생성자 함수를 종료하는 정상적인 리턴문
}
Circle::Circle() {
...
return 0; // 컴파일 오류. 생성자 함수는 값을 리턴해서는 안 됨
}
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
Circle(); // 기본 생성자
Circle(int r); // 매개 변수 있는 생성자
double getArea();
};
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle donut; // 매개 변수 없는 생성자 호출
double area = donut.getArea();
cout << "donut 면적은 " << area << endl;
Circle pizza(30); // 매개 변수 있는 생성자 호출
area = pizza.getArea();
cout << "pizza 면적은 " << area << endl;
}
실행결과
반지름 1 원 생성
donut 면적은 3.14
반지름 30 원 생성
pizza 면적은 2826
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << "원 생성" << endl; // 코드 중복
}
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << "원 생성" << endl; // 코드 중복
}
Circle::Circle() : Circle(1) { } // Circle(int r)의 생성자 호출
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << "원 생성" << endl; // 코드 중복
}
타켓 생성자
위임 생성자
라고 부름클래스의 멤버 변수들은 자동으로 초기화되지 않기 때문에 생성자에서 초기화 함
2개의 생성자가 각각 멤버 변수를 초기화하는 Point 클래스
class Point {
int x, y;
public:
Point();
Point(int a, int b);
};
Point::Point() { x = 0; y = 0; }
Point::Point(int a, int b) { x = a; y = b; }
이 2개의 생성자는 생성자 코드의 구현부에 멤버 변수와 초깃값을 쌍으로 지정하고 이들을 콤마(,)로 나열하여 작성할 수 있음
Point::Point() : x(0), y(0) { // 멤버 변수 x, y를 0으로 초기화
}
Point::Point(int a, int b) // 멤버 변수 x=a, y=b로 초기화
: x(a), y(b) { // 콜론(:) 이하 부분을 다음 줄에 써도 됨
}
또는 다음과 같이 멤버 변수 초기화 가능
Point::Point(int a)
: x(a), y(b) {
}
Point::Point(int a)
: x(100+a), y(100) {
}
멤버 변수는 C++11부터 다음과 같이 선언문에서 직접 초기화 가능
class Point {
int x = 0, y = 0;
...
};
#include <iostream>
using namespace std;
class Point {
int x, y;
public:
Point();
Point(int a, int b);
void show() { cout << "(" << x << ", " << y << ")" << endl; }
};
Point::Point() : Point(0, 0) { } // Point(int a, int b) 생성자 호출
Point::Point(int a, int b)
: x(a), y(b) { }
int main() {
Point origin;
Point target(10, 20);
origin.show();
target.show();
}
실행결과
(0, 0)
(10, 20)
생성자는 꼭 있어야 하는가?
- C++ 컴파일러는 객체가 생성될 때 생성자 중 반드시 하나를 호출하도록 컴파일 함.
- 따라서 생성자는 꼭 존재해야 함!
✅ 생성자를 선언하지 않은 클래스는 어떻게 될까?
- 생성자가 없는 클래스에 대해서는 컴파일러가
기본 생성자
(default construct)를 만들어 삽입하고, 자신이 삽입한 기본 생성자를 호출하도록 컴파일 함
class Circle {
Circle(); // 기본 생성자
};
소멸자
(destructor) : 객체가 소멸되는 시점에서 자동으로 호출되는 클래스의 멤버 함수Circle::~Circle() {...}
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
Circle();
Circle(int r);
~Circle(); // 소멸자 선언
double getArea();
};
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
} // Circle::Circle():Circle(1)으로 해도 됨
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle::~Circle() {
cout << "반지름 " << radius << " 원 소멸" << endl;
}
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle donu;
Circle pizza(30);
return 0;
}
실행결과
반지름 1 원 생성
반지름 30 원 생성
반지름 30 원 소멸
반지름 1 원 소멸
지역 객체
(local object)라고 부르고, 함수가 실행될 때 생성되고 함수가 종료할 때 소멸됨 전역 객체
(global object)라고 부르고, 프로그램이 로딩될 때 생성되고 main()이 종료한 뒤 프로그램 메모리가 사라질 때 소멸됨예제 : 지역 객체와 전역 객체의 생성 및 소멸 순서
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
Circle();
Circle(int r);
~Circle();
double getArea();
};
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
} // Circle::Circle():Circle(1)로 해도 됨
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle::~Circle() {
cout << "반지름 " << radius << " 원 소멸" << endl;
}
double Circle::getArea() {
return 3.14*radius*radius;
}
Circle globalDonut(1000); // 전역 객체 생성
Circle globalPizza(2000); // 전역 객체 생성
void f() {
Circle fDonut(100); // 지역 객체 생성
Circle fPizza(200); // 지역 객체 생성
}
int main() {
Circle mainDonut; // 지역 객체 생성
Circle mainPizza(30); // 지역 객체 생성
f();
}
실행 결과
반지름 1000 원 생성
반지름 2000 원 생성
반지름 1 원 생성
반지름 30 원 생성
반지름 100 원 생성
반지름 200 원 생성
반지름 200 원 소멸
반지름 100 원 소멸
반지름 30 원 소멸
반지름 1 원 소멸
반지름 2000 원 소멸
반지름 1000 원 소멸
해당 포스팅은 '황기태, 『명품 C++ Programming』, 생능출판사'를 참고하여 작성하였습니다.