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

+ Recent posts