const 객체와 const 객체의 특성
const SoSimple sim(20);
위와 같이 객체에 const 선언을 하게되면 이 객체를 대상으로는 cosnt 멤버함수만 호출이 가능하다. 따라서, 값을 변경하지 않는 멤버함수를 정의할때는 const 객체에서도 호출이 가능하도록 할 필요가 있다.
const와 함수오버로딩
void SimpleFunc(){ ,,, }
void SimpleFunc() const {,,,}
const 키워드의 선언유무도 함수오버로딩의 조건이된다. const 객체를 대상으로 함수 호출시 const 멤버함수가 , 일반 객체를 대상으로 함수호출시 일반 멤버함수가 호출된다.
클래스의 friend 선언
A클래스가 B클래스를 대상으로 friend 선언을 하면 , B클래스는 A클래스의 private 멤버에 직접접근이 가능하다.
A클래스가 B클래스의 private 멤버에 접근하려면 , B클래스가 A 클래스를대상으로 friend 선언을 해야한다.
include <iostream>
using namespace std;
class Girl; // Girl 이 클래스라는 선언
class Boy
{
private:
int height;
friend class Girl; // Girl 을 대상으로 friend 선언 , friend 선언은 클래스 내부 어디에들어가도 상관없으며 , 그 자체로 Class Girl; 선언이 들어가있기때문에 Class Girl; 선언을 하지않아도된다.
public:
Boy(int len) : height(len)
{}
void ShowYourFriendInfo(Girl &frn); // Girl의 정보가 없기때문에 함수정의는 뒤로뺀다
};
class Girl
{
private:
char phNum[20];
public:
Girl(char* num)
{
strcpy(phNum,num);
}
voidShowYourFriendInfo(Boy &frn); // friend class Boy 선언이 컴파일되기전이기때문에 , Boy의 정보를 알 수 없으므로 정의를 뒤로뺀다
friend class Boy;
};
void Boy::ShowYourFriendInfo( Girl &frn )
{
cout<<"Her Phone Number: " <<frn.phNum<<endl;
}
void Girl::ShowYourFriendInfo( Boy &frn)
{
cout<<"His height: "<<frn.heignt<<endl;
}
int main(void)
{
Boy boy(170);
Girl girl("010-1111-1111");
boy.ShowYourFriendInfo(girl);
girl.ShowYourFrinedInfo(boy);
return 0;
}
friend 선언은 지나치면 아주 위험할 수 있으므로 , friend 선언은 필요한 상황에서 극히 소극적으로 사용해야한다.
함수를 대상으로한 friend 선언
friend 선언은 전역함수를 대상으로도 ,클래스의 멤버함수를 대상으로도 선언이 가능하며 , 이때 선언된 함수는 선언된 클래스의 private 영역에 접근이가능하다.
class Point; // 컴파일을 위해 Point 가 class 라는 선언
class PointOP
{
private :
int opcnt;
public:
PointOP () : opcnt(0)
{}
Point PointAdd( const Point& , const Point&);
}
class Point
{
private:
int x;
int y;
pubilc:
Point(const int &xpos , const int & ypos) : x(xpos),y(ypos)
{}
friend Point PointOP::PointAdd(const Point& , const Point&);
friend void ShowPointPos(const Point&); // 함수정의생략 , 이 선언시, void ShowPointPos(const Point&) 함수원형선언이 포함되므로 , 별도의 함수원형을 선언할 필요 없다.
};
Point PointOP :: PointAdd(const Point& pnt1, const Point & pnt2)
{
opcnt++;
return Point (pnt1.x + pnt2.x , pnt1.y+pnt2.y); // Point 클래스 내에서 friend 선언된 멤버함수이기때문에 , Point 클래스의 private 멤버에 접근가능
}
C언어에서의 static
전역변수에 선언된 static 의의미 -> 선언된 파일 내에서만 참조를 허용한다는 의미
함수내에 선언된 static 의 의미 -> 프로그램실행시 한번만 초기화되고 , 지역변수와 달리 함수를 빠져나가도 소멸되지않는다.
C++ 에서의 static
C++에서는 클래스 내에 static 멤버변수를 선언할 수있으며 , 이 변수는 객체마다가 아닌 클래스당 하나만 생성되며 , 객체에 종속되지않고 , 선언된 클래스나 객체를 통해서만 접근이 가능하다. ( private 로 선언되면 클래스 내에서만 접근가능하고 , public으로 선언되면 클래스의 이름이나 객체의 이름을통해 어디서든 접근 가능하다 )
static 변수는 생성자가아닌 함수외부에서 초기화를 진행해야하는데 , 이는 생성자에서 초기화시 , 객체를 생성할때마다 static 변수가 초기화되기때문이다.
int SoSimple :: SimObjCnt =0;
이런식으로 클래스 밖에서 초기화해주어야한다.
static 멤버함수의 특성
선언된 클래스의 모든 객체가 공유한다
public으로 선언이되면 , 클래스의 이름을 사용해서 호출이 가능하다
객체의 멤버로 존재하는것이 아니다
객체의 멤버로 존재하지 않기때문에 , static 멤버함수 내에서는 static 멤버변수와 static 멤버함수만 호출이 가능하다
class SoSimple
{
private:
int num1;
static num2;
public:
SoSiple(int n) : num1(n)
{}
static void Adder(int n)
{
num1+=n; // num1 이 static 변수가 아니기때문에 컴파일에러발생
num2 +=n;
}
};
const static 멤버
클래스 내에 선언된 const 멤버변수의 초기화는 이니셜라이저를 통해야만하지만, const static 으로 선언되는 멤버변수는 선언과 동시에 초기화가 가능하다.
class ContryArea
{
public:
const static int RUSSIA = 1707540;
...
};
mutable 키워드
mutable int num;
mutable 키워드가 선언된 멤버는 cosnt 함수 내에서의 값의 변경을 예외적으로 허용한다
mutable 키워드의 과도한사용은 C++ 에 있어서 중요성을 인정받은 const 키워드의 선언을 의미없게 만들어버리므로 , 최대한 사용을 자제해야한다.
'C++언어 > 열혈C++' 카테고리의 다른 글
C++ : Chapter -8 상속과 다형성 (0) | 2018.05.22 |
---|---|
C++ : Chapter -7 상속의 이해 (0) | 2018.05.20 |
C++ : Chapter -5 복사생성자 (0) | 2018.05.10 |
C++ : Chapter -4 클래스 PART2 (0) | 2018.05.02 |
C++ : Chapter -3 클래스 PART1 (0) | 2018.04.26 |