클래스 기본 문법
클래스: 함수를 포함 할 수 있는 구조체
클래스 문법
class 클래스이름
{
접근제어지시자:
멤버변수선언;
멤버함수선언및정의;
};
구조체와의 차이점: 접근 제어지시자가 존재, 함수를 멤버로 포함할 수 있음.
멤버 선언 및 정의
- 클래스는 생성자를 이용해 멤버변수를 초기화할 수 있다.
- 생성자: 반환자료형이 없다. 호출하는 함수가 아니라 적절한 시기에 내부에서 자동으로 호출되는 함수.
생성자
//제작자 코드
class CTest
{
public:
CTest() //CTest 클래스의 '생성자 함수' 선언 및 정의
{
m_nData = 10; //인스턴스가 생성되면 자동으로 초기화
}
int m_nData; //멤버 데이터 선언.
//(생성자보다 밑에 있어도 클래스 내부에 선언되어있으면 생성자에서 사용할 수 있다.)
void PrintData() //멤버함수
{
cout << m_nData <<endl; //멤버 데이터에 접근하고 출력
}
};
//사용자 코드
int main(){
CTest t; //선언하면 생성자 함수가 호출된다.
t.PrintData();
return 0;
}
멤버함수 선언과 정의를 분리
함수 원형만 두고 나머지 몸체는 클래스 선언 외부에 별도로 정의한다.
분리한 멤버함수 이름 앞에 소속 클래스 이름과 ::을 기술한다.
//제작자 코드
class CTest
{
public:
CTest()
{
m_nData = 10;
}
int m_nData;
void PrintData(); // 멤버함수 선언, 정의 분리
};
void CTest::PrintData() //외부에 분리된 멤버 함수 정의
{
cout << m_nData <<endl; //CTest 클래스의 멤버변수에 접근하는 것.
//멤버함수의 식별자 검색 순서
//(1) 지역변수 (2) 클래스의 멤버변수 (3) 전역변수
}
//사용자 코드
int main(){
CTest t;
t.PrintData();
return 0;
}
생성자 함수에서 생성자 초기화 목록을 활용한 멤버변수 초기화
* 멤버변수가 참조자형식(int &data)이면 반드시 초기화 목록을 이용해 초기화 해야한다.
//제작자 코드
class CTest
{
public:
//생성자 초기화 목록을 이용한 멤버 초기화
CTest() //함수원형
:m_nData1(10), m_nData2(20) //생성자 초기화목록
//함수원형 다음에 콜론(:)을 기술한다.
//그리고 멤버변수(초기값) 형식으로 기술한다.
//초기화하려는 멤버 변수가 여러 개면 쉼표를 찍고 이어서 작성.
//함수원형과 블록사이에 '생성자초기화목록'이 위치한다.
{ } //블록
int m_nData;
void PrintData(); // 멤버함수 선언, 정의 분리
};
void CTest::PrintData() //외부에 분리된 멤버 함수 정의
{
cout << m_nData <<endl; //CTest 클래스의 멤버변수에 접근하는 것.
//멤버함수의 식별자 검색 순서
//(1) 지역변수 (2) 클래스의 멤버변수 (3) 전역변수
}
//사용자 코드
int main(){
CTest t;
t.PrintData();
return 0;
}
생성자에 일일이 값을 기술하는 것이 귀찮다면 멤버변수 선언과 동시에 초기화 가능하다. (C++11부터 가능)
//제작자 코드
class CTest
{
public:
//생성과 동시에 멤버변수 초기화
int m_nData1 = 10;
int m_nData2 = 20;
};
변수를 적절히 초기화 하는 것의 중요성
초기화를 사용자에게 맡겨도 좋겠지만 사용자가 별도로 값을 지정하지 않는다면 제작자가 적절한 값을 작성할 수 있게 해줌으로써 버그를 차단할 수 있다. 무엇보다 사용자는 매우 편리하게 객체를 사용할 수 있다.
'◼️C++' 카테고리의 다른 글
[C++] 생성자와 소멸자 (0) | 2023.09.17 |
---|---|
[C++] 클래스 접근 제어 지시자 (0) | 2023.09.17 |
[C++] 객체지향 프로그래밍 개요 (0) | 2023.09.17 |
[C++] 식별자 검색 순서 (0) | 2023.09.07 |
[C++] 네임스페이스, using, 네임스페이스 중첩, 네임스페이스 다중정의 (0) | 2023.09.06 |