class 클래스이름
{
접근제어지시자:
멤버변수;
멤버함수 선언 및 정의
};
#include <iostream>
using namespace std;
class CTest{
public :
CTest(){//생성자
m_nData = 10;
}
int m_nData;
void PrintData(void){
cout<<m_nData<<endl;
}
};
int main(){
CTest t; //생성자 호출
t.PrintData();
return 0;
}
/* 출력결과
10
*/
#include <iostream>
using namespace std;
class CTest{
public :
CTest(){//생성자
cout<<"CTest() : 생성자 호출"<<endl;
m_nData = 10;
}
int m_nData;
void PrintData(void);
};
void CTest::PrintData(void){ //함수 선언, 정의 분리 가능
cout<<m_nData<<endl;
}
int main(){
cout<<"main() 시작"<<endl;
CTest t;
t.PrintData();
cout<<"main() 끝"<<endl;
return 0;
}
/* 출력결과
main() 시작
CTest() : 생성자 호출
10
main() 끝
*/
#include <iostream>
using namespace std;
class CTest{
public :
CTest()
: m_nData1(10), m_nData2(20)//초기화목록
{
//초기화 목록에는 = 안됨
//멤버 변수가 참조자 형식이면 반드시 초기화목록 사용
}
int m_nData1;
int m_nData2;
void PrintData(void){
cout<<m_nData1<<endl;
cout<<m_nData2<<endl;
}
};
int main(){
CTest t;
t.PrintData();
return 0;
}
public : 모든 외부 접근 가능
protected : 차단. 단, 상속 관계-파생 클래스에서의 접근 허용
private : 차단. 클래스 선언 시 별도 기술하지 않으면 private으로 간주
주의 : 생성자에 접근제어 지시자를 기술하지 않으면 컴파일 오류가 남. 일부러 private으로 선언하는 경우도 있긴 함
#include <iostream>
using namespace std;
class CTest{
public:
CTest(){
cout<<"CTest::CTest()"<<endl;
}
~CTest(){
cout<<"CTest::~CTest()"<<endl;
}
};
CTest outmain;
int main(){
cout<<"main begin"<<endl;
CTest a;
cout<<"main end"<<endl;
return 0;
}
/* 출력결과
CTest::CTest() - outmain
main begin
CTest::CTest() - a
main end
CTest::~CTest() - a
CTest::~CTest() - outmain
*/
#include <iostream>
using namespace std;
class CTest{
int m_nData;
public:
CTest(){
cout<<"CTest::CTest()"<<endl;
}
~CTest(){
cout<<"CTest::~CTest()"<<endl;
}
};
int main(){
cout<<"main begin"<<endl;
CTest* pData = new CTest;
cout<<"Test"<<endl;
delete pData;
cout<<"main end"<<endl;
return 0;
}
#include <iostream>
using namespace std;
class CRefTest{
public:
CRefTest(int &rParam) : m_nData(rParam){};
int GetData(void){return m_nData;};
private:
int &m_nData;
};
int main(){
int a = 10;
CRefTest t(a);
cout<<t.GetData()<<endl;
a = 20;
cout<<t.GetData()<<endl;
return 0;
}
/* 출력 결과
10
20
*/
#include <iostream>
using namespace std;
class CMyPoint{
public:
CMyPoint(int x){
cout<<"CMyPoint(int)"<<endl;
if(x>100){
x = 100;
}
m_x = 100;
}
CMyPoint(int x, int y)
: CMyPoint(x) //CMypoint(int) call
{
cout<<"CMyPoint(int, int)"<<endl;
cout<<x<<endl;
if(y>200){
y = 200;
}
m_y = 200;
}
void Print(){
cout<<"X : "<<m_x<<endl;
cout<<"Y : "<<m_y<<endl;
}
private:
int m_x = 0;
int m_y = 0;
};
int main(){
CMyPoint ptBegin(110);
ptBegin.Print();
CMyPoint ptEnd(50, 250);
ptEnd.Print();
}
/*출력결과
CMyPoint(int)
X : 100
Y : 0
CMyPoint(int)
CMyPoint(int, int)
50
X : 100
Y : 200
*/
메서드 : 클래스의 멤버 함수(메서드를 통해 멤버변수를 제어할 수 있으므로 ‘인터페이스 함수'라고도 불림)
static 반환자료형 클래스이름::함수이름(매개변수) const;
//static, const 생략 가능
#include <iostream>
using namespace std;
class CTest{
public:
CTest(int nParam)
:m_nData(nParam){
m_nCount++;
}
int GetData(){
return m_nData;
};
void ResetCount(){
m_nCount = 0;
};
static int Getcount(){
return m_nCount;
};
private:
int m_nData;
static int m_nCount;
};
int CTest::m_nCount = 0;
int main(){
CTest a(5), b(10);
cout<<a.Getcount()<<endl;
b.ResetCount();
cout<<CTest::Getcount()<<endl;
return 0;
}
/*출력결과 : 전역변수처럼 사용됨.
2
0
*/