클래스 작성 및 객체 생성
접근 지정자
- private 멤버는 클래스 안에서만 사용될 수 있다.
- protected 멤버는 클래스 안과 상속된 클래스에서 사용될 수 있다.
- public 멤버는 어디서나 사용될 수 있다.
접근자와 설정자
#include <iostream>
using namespace std;
class Time {
public:
Time(int h, int m);
void Print();
int GetHour() {
return hour;
}
int GetMinute() {
return minute;
}
void SetHour(int h) { hour = h; }
void SetMinute(int m) { minute = m; }
private:
int hour; // 0-23
int minute; // 0-59
};
int main()
{
Time a{ 0,0 };
a.SetHour(6);
a.SetMinute(30);
a.Print();
return 0;
}
클래스의 인터페이스와 구현의 분리
- 복잡한 클래스인 경우에는 멤버 함수를 클래스 외부에서 정의
#include <iostream>
using namespace std;
class Circle {
public:
double calcArea();
int radius; // 반지름
string color; // 색상
};
double Circle :: calcArea() {
return 3.14*radius*radius;
}
int main()
{
Circle c;
c.radius = 10;
cout << c.calcArea() << endl;
}
클래스의 선언과 클래스의 정의 분리
생성자 (초기화를 담당하는 함수)
- 생성자는 오직 한 번만 실행된다.
- 생성자 함수의 이름은 클래스 이름과 동일하게 작성되어야 한다.
- 생성자 함수의 원형에 리턴 타입을 선언하지 않는다.
- 생성자는 매개변수를 달리하여 중복 가능하다.
생성자의 중복 정의
디폴트 생성자
멤버 초기화 리스트
- 비용적으로 효율적
생성자 호출 + 대입으로 이어지는 2번의 함수 호출이 일어남
초기화 리스트에 넣는다는 것은, 대입이 아닌 초기화를 수행한다는 것
한 번의 생성자 호출로 초기화가 가능
2. 상수 멤버나 참조자 멤버는 무조건 사용
중괄호 초기화
장점 1 : 컨테이너에 활용하기 좋음.
c++11 이후 초기화 문법 통일 -> 중괄호 초기화
장점 2: 축소 변환을 방지
장점 3: 오버플로우 오류 발생 방지
소멸자 (객체가 소멸되는 시점에서 자동으로 호출되는 함수)
- 소멸자의 목적은 객체가 사라질 때 필요한 마무리 작업을 위함이다.
- 소멸자의 이름은 클래스 이름 앞으로 ~를 붙인다.
- 소멸자는 리턴 타입이 없으며 어떠한 값도 리턴해서도 안된다.
- 소멸자는 오직 한 개만 존재하며 매개변수를 가지지 않는다.
class Circle {
public :
int radius;
Circle();
Circle(int r);
~Circle(); // 소멸자
double getArea();
};
Circle :: ~Circle() {
cout << "반지름" << radius << " 원 소멸" << endl;
}
this 포인터
- 포인터, 객체 자신 포인터
- 클래스의 멤버 함수 내에서만 사용
- 멤버 함수에 컴파일러에 의해 묵시적으로 삽입 선언되는 매개 변수
class Circle {
int radius;
public :
Circle() { this-> radius=1; }
Circle(int radius) { this-> radius = radius; }
void SetRadius(int radius) { this-> radius = radius; }
...
};
this가 필요한 경우
- 매개변수의 이름과 멤버 변수의 이름이 같은 경우
- 멤버 함수가 객체 자신의 주소를 리턴할 때
- 연산자 중복 시에 매우 필요
객체가 함수의 매개 변수로 전달되는 경우
class Pizza {
public:
Pizza(int s) : size(s) { }
int size; // 단위: 인치
};
void makeDouble(Pizza p){
p.size *= 2;
}
int main(){
Pizza pizza(10);
makeDouble(pizza);
cout << pizza.size << "인치 피자" << endl;
}
객체의 참조자가 함수의 매개 변수로 전달되는 경우
class Pizza {
public:
Pizza(int s) : size(s) { }
int size; // 단위: 인치
};
void makeDouble(Pizza& p){
p.size *= 2;
}
int main(){
Pizza pizza(10);
makeDouble(pizza);
cout << pizza.size << "인치 피자" << endl;
}
객체의 참조자가 함수의 매개 변수로 전달되는 경우
'C++' 카테고리의 다른 글
<C++> 9. 시간 복잡도 (0) | 2024.04.15 |
---|---|
<C++> 8. 연산자 중복 (0) | 2024.04.02 |
<C++> 6. 배열과 벡터 (1) | 2024.03.26 |
<C++> 5. 함수 (0) | 2024.03.25 |
<C++> 4. 제어구조 (0) | 2024.03.19 |