이 블로그는 애드센스 수익으로 운영되고 있습니다.
광고차단앱을 해제해주시면 블로그 운영에 큰 도움이 됩니다.

'Static'에 해당되는 글 1건

  1. C++ static과 friend 2013.03.19

C++ static과 friend

from Programing/C++ 2013. 3. 19. 20:38

■정적(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;

};


int A::m_nVar =0; 


 

 


 


#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;

} 



,