생성자의 목적은 객체가 생성될 때 객체가 필요한 초기화를 위함이다
ex) 멤버 변수 값 초기화, 메모리 할당, 파일 열기, 네트워크 연결 등
생성자 이름은 반드시 클래스 이름과 동일
생성자는 리턴 타입 없음
객체 생성 시 오직 한 번만 자동으로 호출되고, 각 객체마다 생성자를 실행한다
생성자는 오버로딩 가능
생성자가 선언되어 있지 않으면, 컴파일러에 의해 매개 변수 없는 기본 생성자 자동으로 생성한다
소멸자의 목적은 객체가 사라질 때 마무리 작업을 위함이다
ex) 실행 도중 동적으로 할당 받은 메모리 해제, 파일 저장 및 닫기, 네트워크 닫기 등
소멸자 함수의 이름은 클래스 이름 앞에 ~를 붙인다
ex) Circle::~Circle() {...}
소멸자는 리턴 타입 선언 불가
소멸자는 매개 변수 없는 함수로 중복 작성 불가능 하다 (오버로딩X)
소멸자가 선언되어 있지 않으면, 컴파일러에 의해 기본 소멸자 코드가 자동으로 생성되며, 아무것도 하지 않고 단순 리턴만 한다
main()의 스택에 순서대로 객체가 생성되며, return 0;
문이 실행되면 생성된 반대수으로 객체가 소멸된다.
전역 객체 생성 -> main 함수 객체 생성 -> f() 함수 객체 생성 -> f() 함수 객체 소멸 -> main 함수 객체 소멸 -> 전역 객체 소멸
작은 크기의 함수를 호출하면, 함수 실행 시간에 비해, 호출을 위해 소요되는 부가적인 시간 오버헤드가 상대적으로 크다.
클래스 선언부에 구현된 멤버 함수
- inline으로 선언할 필요 없음
- 컴파일러에 의해 자동으로 인라인 처리
- 생성자를 포함, 모든 함수가 자동 인라인 함수 가능
목적 : 클래스 재사용
-> 조건 컴파일로 해결
실수의 지수 표현을 클래스 Exp로 작성하라. 클래스 Exp를 Exp.h 헤더 파일과 Exp.cpp 파일로 분리하여 작성하라.
#ifndef EXP_H
#define EXP_H
//선언부 : 컴파일러에게 선언하는 것.
// return 의 역할 : 함수를 부른 곳으로 돌아가는 것.
class Exp {
private:
int base, exp;
public:
Exp() { base = exp = 1; } //inline 함수로 선언
Exp(int a) { base = a; exp = 1; }
Exp(int a, int b);
int getBase() { return base; }
int getExp() { return exp; }
int getValue();
bool equals(Exp b);
};
#endif
#include "Exp.h"
#include <math.h> //pow 함수 사용 위한 헤더파일.
Exp::Exp(int a, int b) {
base = a;
exp = b;
}
int Exp::getValue() {
return (int)pow(base, exp); //pow : 거듭제곱 함수
}
bool Exp::equals(Exp b) {
return getValue() == b.getValue();
}
#include <iostream>
using namespace std;
#include "Exp.h"
int main() {
Exp a(3,2); //3^2=9. 베이스 3, 지수 2
Exp b(9); //9^1=9. 베이스 9, 지수 1
Exp c; //1^1. 베이스 1, 지수 1
cout << a.getValue() << ' ' << b.getValue() << ' ' << c.getValue() << endl; //9 9 1
cout << "a의 베이스 " << a.getBase() << ", 지수 " << a.getExp() << endl; //a의 베이스 3, 지수 2
if(a.equals(b))
cout << "same" << endl;
else
cout << "not same" << endl;
}