2 minute read

const와 관련해서 아직 못다한 이야기

class SoSimple
{
private :
    int num;
public :
    SoSimple(int n) : num(n)
    {}
    SoSimple& AddNum(int n)
    {
        num+=n;
        return *this;
    }
    void ShowData() const
    {
        cout<<"num: "<<num<<endl;
    }
};

int main(void)
{
    const SoSimple obj(7); // 이 객체의 데이터 변경을 허용 하지 않겠다..!!
    // obj.AddNum(20);
    obj.ShowData();
    return 0;
}

const 와 함수 오버로딩

// A *B 와 같이 포인터 배열로 선언하면 인터에 주소가 할당된 경우
// B가 포인터기에 B->a 를 해야지만 값을 가지고 올수 있습니다.
class SoSimple
{
    private :
        int num;
    public :
        SoSimple(int n) : num(n)
        { }
        SoSimple& AddNum(int n)
        {
            num +=n;
            return this;
        }
        void SimpleFunc()
        {
            cout<<"SimpleFunc: "<<num<<endl;
        }
        // 함수의 const 선언은 오버로딩 조건이 된다!

        void SimpleFunc() const
        {
            cout<<"const SimpleFunc: "<<num<<endl;
        }
};

void YourFunc(const SoSimple &obj)
{
    obj.SimpleFunc();
}
int main(void)
{
    SoSimple obj1(2);
    const SoSimple obj2(7);
    obj1.SimpleFunc();
    obj2.SimpleFunc();
    return 0;
}

// output
// SimpleFunc: 2
// const SimpleFunc: 7

클래스와 함수에 대한 friend 선언


클래스 friend 선언

  • friend 선언은 private 멤버의 접근을 허용하는 선언이다.
  • friend 선언은 정보은닉에 반하는 선언이기 때문에 매우 제한적으로 선언되어야한다.
class Boy
{
    private :
        int height;
        // Gril 클래스에 대한 friend 선언
        friend class Girl;
    public :
        Boy(int len) : height(len)
        {}
        ...
};

class Girl
{
    private:
        char phNum[20];
    public:
        Girl(char * num)
        {
            strcpy(phNum, num);
        }
        void ShowYourFriendInfo(Boy &frn)
        {
            // Girl이 Boy의 friend로 선언되었으므로 private 멤버에 직접 접근이 가능하다.
            cout<<"His height: "<<frn.height<<endl;
        }
};

함수의 friend 선언

class Point
{
    private :
        int x;
        int y;
    public :
        Point(const int &xpos, const int &ypos) : x(pos), y(ypos)
        {}
        friend Point PointOP::PointAdd(const Point&, const Point&);
        friend Point PointOP::PointSub(const Point&, const Point&);
        friend void ShowPointPos(const Point&);
        // 전역 변수 대상의 friend 선언
        // 이렇듯 클래스의 특정 멤버 함수를 대상으로도 friend 선언이 가능하다.
};

// 아래 함수들은 private 멤버에 접근이 가능핟.
Point PointOP::PointAdd(const Point& pnt1, const Point& pnt2)
{
    opcnt++;
    return Point(pnt1.x+pnt2.x, pnt1.y + pnt2.y);
}
Point PointOP::PointSub(const Point& pnt1, const Point& pnt2)
{
    opcnt++;
    return Point(pnt1.x-pnt2.x, pnt1.y-pnt2.y);
}

void ShowPointPos(const Point& pos)
{
    cout<<"x: "<<pos.x<<", ";
    cout<<"y: "<<pos.y<<endl;
}

C++에서의 static


C언어에서 이야기한 static

  • 전역변수에 선언된 static의 의미
    • 선언된 파일내에서만 참조를 허용하겠다.
  • 함수 내에 선언된 static의 의미
    • 한번만 초기화 되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.
void Counter()
{
    static int cnt;
    cnt++;
    cout<<"Current cnt: "<<cnt<<endl;
}
int main(void)
{
    for(int i = 0; i<4; i++)
    {
        Counter();
    }
    return 0;
}

output

Current cnt: 1
Current cnt: 2
Current cnt: 3
Current cnt: 4S

static 멤버변수(클래스 변수)

  • static 변수는 객체 별로 존재하는 변수가 아닌 프로그램 전체 영역에서 하나만 존재하는 변수이다.
  • 프로그램 실행과 동시에 초기화 되어 멤리 공간에 할당된다. ```cpp class SoSimple { private: static int simObjCnt; public: SoSimple() { simObjCnt++; cout«simObjcnt«“번째 SoSimple 객체”«endl; } };

// static 멤버변수의 초기화 int SoSimple::simObjCnt = 0;

int main(void) { SoSimple sim1; SoSimple sim2; … }

```

Categories:

Updated: