■정적(static) 클래스와 지역 정적(static)클래스
- static class의 특징
한번 생성과 초기화
프로그램이 종료될 때 까지 소멸되지 않는다.
- 형식(1) : 기본 생성자만 있는 경우
class A{}; class B{ public: static A Test; }; A B::Test; //클래스의 초기화 int main() { //생략 } |
- 형식(2) : 생성자에 초기화가 있는 경우
class A{ public: A(int nVar){} }; class B{ public: static A Test; }; A B::Test(10); //클래스의 초기화 int main() { |
- 예
#include <iostream> using namespace std; class A{ private: int m_nVar; public: A(int nVar){ m_nVar = nVar; cout<<"A 생성자 호출"<<m_nVar<<endl; } void Print(){cout<<m_nVar<<endl;} ~A(){cout<<"A 소멸자 호출"<<endl;} }; class B{ public: static A ClassA;
B(){cout<<"B 생성자 호출"<<endl;} ~B(){cout<<"B 소멸자 호출"<<endl;} }; A B::ClassA(10); //클래스의 초기화 void Set(int nVar) { static A test(nVar); test.Print(); } int main() {
Set(7); Set(12);
B test1, test2; test1.ClassA.Print(); test2.ClassA.Print(); return 0; } A 생성자 호출10 A 생성자 호출7 7 7 B 생성자 호출 B 생성자 호출 10 10 B 소멸자 호출 B 소멸자 호출 A 소멸자 호출 A 소멸자 호출 |
■정적 멤버변수
- 모든 같은 클래스 안에서 공유하는 변수
- 클래스의 전역변수 역할
- 클래스 외부에서 한번은 초기화해야 한다.
- 초기화할 때는 ::을 이용하여 소속을 지정
■정적 멤버변수의 특징
- 클래스를 생성하지 않아도 정적 멤버변수를 사용할 수 있다.
- 형식
class A{ private: static int m_nVar; }; |
#include <iostream> using namespace std; class A{ private: static int m_nVar; public: static int m_nPublicVar; void Set(int nVar){m_nVar = nVar;} void Print(){cout<<m_nVar<<endl;} }; int A::m_nVar = 0; int A::m_nPublicVar = 0; int main() { cout<<"public 정적 멤버 변수:"<<A::m_nPublicVar<<endl;
A test1, test2, test3;
test1.Set(12); test1.Print(); test2.Print(); test3.Print();
A::m_nPublicVar = 7; cout<<test1.m_nPublicVar<<'\t'<<test2.m_nPublicVar<<'\t'<<test3.m_nPublicVar<<endl; cout<<A::m_nPublicVar<<endl;
return 0; } public 정적 멤버 변수:0 12 12 12 7 7 7 7 |
■정적 멤버함수
- 정적 멤버변수에만 접근하는 함수
- 함수 안에 this 사용 불가
■정적 멤버변수의 특징
- 클래스를 생성하지 않아도 정적 멤버함수를 사용할 수 있다.
#include <iostream> using namespace std; class A{ private: static int m_nVar; public: static int m_nPublicVar; void Set(int nVar){m_nVar = nVar;} void Print(){cout<<m_nVar<<endl;} static void Add(int nVar){m_nPublicVar += nVar;} }; int A::m_nVar = 0; int A::m_nPublicVar = 0; int main() { A::Add(12); cout<<A::m_nPublicVar<<endl;
A test1, test2;
test1.Add(7);
cout<<test1.m_nPublicVar<<'\t'<<test2.m_nPublicVar<<endl;
return 0; } 12 19 19 |
■friend
- 일반 함수가 클래스의 모든 멤버에 접근할 수 있도록 한다.
■friend 사용 용도
- 클래스 안에 멤버 함수를 두지 않고 외부에 두고자 하는 경우
■friend 참고 사항
- 상속되지 않는다.
- 형식
class A{ private: int m_nVar; public: friend bool IsEqual(A& a, A& b); }; bool IsEqual(A& a, A& b) { if(a.m_nVar ==b.m_nVar) return 1; else return 0; } |
- friend 함수 예
#include <iostream> using namespace std; class A{ private: int m_nVar; public: A(int nVar) : m_nVar(nVar){} friend bool IsEqual(A& a, A& b); }; bool IsEqual(A& a, A& b) { if(a.m_nVar ==b.m_nVar) return 1; else return 0; } int main() { A test1(7), test2(12); if(IsEqual(test1, test2) ==1) cout<<"같은 값"<<endl; else cout<<"다른 값"<<endl;
return 0; }
다른 값 |
#include <iostream> using namespace std; class B; //class B 가 있다는 것을 알림 class A{ private: int m_nVar; public: A(int nVar) : m_nVar(nVar){} friend bool IsEqual(A& a, B& b); }; class B { private: int m_nVar; public: B(int nVar) : m_nVar(nVar){} friend bool IsEqual(A& a, B& b);
}; bool IsEqual(A &a, B &b) { if(a.m_nVar == b.m_nVar) return 1; else return 0; } int main() { A test1(12); B test2(12);
if(IsEqual(test1, test2) == 1) cout<<"같은 값"<<endl; else cout<<"다른 값"<<endl;
return 0; } |
■friend 클래스
- friend 클래스로 선언된 클래스는 자신이 속한 클래스 안의 모든 멤버에 대한 접근 권한을 가지게 된다
- private 권한과 상관없이 멤버를 사용할 수 있다.
■friend 클래스 형식
■friend 클래스 예
#include <iostream> using namespace std; class A { private: int m_nVar; friend class B; public: A():m_nVar(12){} }; class B { public: void Print(A& Ref){cout<<Ref.m_nVar<<endl;} }; int main() { A test1; B test2; test2.Print(test1);
return 0; } |