[C++] 챕터 6
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; … }
```