○클래스
C++에서 클래스를 클래스 타입으로 구분한다.
class A
{
// 클래스 내부에서 선언된 식별자는 클래스 범위(Class Scope)를 가진다.
int _data;
double _data2;
// 멤버로는 함수도 가질 수 있다.
void foo();
};
//이 전처럼 struct와 같은 키워드를 작성하지 않아도 된다.
A a;
// a를 A에 대한 인스턴스라고 한다.
// 메모리에 표현되는 것은 C의 구조체의 그것과 같다.
// [ _data(4) ][ padding(4) ][ _data2(8) ]
Scope - cppreference.com - 클래스 범위
○접근 지정자
- 접근 지정자에는 public(struct의 기본), private, protected가 있다.
// class의 기본 접근 지정자는 private이다.
class A
{
// 이 아래는 private 영역이다.
// private은 클래스 외부에서 접근할 수 없다.
int _privateData;
// 이 아래는 public 영역이다.
// public은 클래스 외부에서 접근할 수 있다.
public:
int PublicData;
};
A a;
a._privateData; // 컴파일 오류, 접근 불가능
a.PublicData; // 접근 가능
○기본 합성 메소드
- 클래스 타입이 기본적으로 갖고 있는 메소드.
- 기본 생성자와 기본 소멸자가 있다.
기본 생성자 - 생성자를 정의해주지 않아도 자동으로 컴파일러에 의해 만들어진다.
class A
{
public:
// 반환타입을 갖지 않고, 타입의 이름과 동일하게 식별자를 사용한다.
// 매개변수가 없는 생성자를 기본 생성자라고 한다.
A()
: _data(0) // 이 부분은 멤버 초기화 목록(Member Initializer List)이라고 한다.
{
_data = 10; // 여기는 초기화가 아니라 '할당'이다.
}
private:
int _data;
};
A a; // 변수로 정의
A b(); // 함수 선언
복사 생성자 - 말 그대로 다른 인스턴스의 데이터를 완전히 복사하는 것이다.
class A
{
public:
A(int data)
: _data(data) { }
A(const A& other)
: _data(other._data) { }
private:
int _data;
};
A a(10);
A a2(a); // 복사 생성자 호출 a2._data는 a._data와 동일하다.
기본 소멸자 - 객체의 수명이 다할 때, 자동으로 호출되어 자원을 정리하기 위해 사용된다.
class A
{
public:
A() : _p(malloc(sizeof(int) * 3)) { }
// 소멸자도 생성자와 마찬가지로 반환 타입이 없으며
// 식별자는 타입 이름 앞에 ~를 붙이고
// 아무런 매개변수도 적지 않는다.
// 보통 이와 같이 자원을 정리할 때 사용한다.
~A() { free(_p); _p = nullptr; }
private:
int* _p;
};
{
A a;
} // 이 부분에서 a.~A(); 가 호출된다.
[C++] explicit (0) | 2022.05.31 |
---|---|
[C++] 오버로딩(OverLoadding) (0) | 2022.05.31 |
[C++] 레퍼런스(Reference) (0) | 2022.05.30 |
[C++] 객체 지향 프로그래밍이란? (0) | 2022.05.30 |
[C++] 별 찍기 (0) | 2022.04.20 |
댓글 영역