최상단 광고

2012년 4월 8일 일요일

C++ 의 프렌드(friend)


프렌드 개념 잡기!!!

1. 프렌드 지정은 단방향이다.

내가 소영이한테 친구를 지정했어!!..
소영이는 나를 친구로 지정안했어!!..
난 소영이를 친구로 생각하니까 소영이가 요청하면 다 받아줘!!..
소영이는 나를 친구로 생각안하니까 내가 요청하는걸 안받아줘!..
이렇게 비참하게 생각하면 딱 와닿음.

2. 프렌드 지정은 전이되지 않는다. (EX 친구의 친구따위는 없다는거다)
3. 복수의 대상에 대해 동시에 프렌드 지정이 가능하다.
 EX ) A는 B랑 C랑 친구하고 싶어요!! +_+ 그럼
         B,C야 친구하자 는 안되고
         B야 친구하자;
         C야 친구하자;
라고 해야된다.

4. 프렌드관계는 상속되지 않는다. (엄마의 친구가 내 친구가 될 순 없자나? -_-..)
하지만, 여기서 예외가 있다.
나에겐 유니크한 부분과 엄마에게 유전받은 똑같은 부분이 있다.
그런 똑같은 부분에선 엄마의 친구와 공감대를 찾을 수 있는것처럼, 사용할수 있지만
나의 유니크한 부분은 안된다는거지.



아래의 예제를 보자.

#include

class Time;
class Date
{
private:
     int year,month,day;
public:
     Date(int y,int m,int d) { year=y;month=m;day=d; }
     void OutToday(Time &t);
};

class Time
{
     friend void Date::OutToday(Time &t);
        (time t) < 값 변경 불가능, 복사만.
        (tima &t) 만약 size가 200byte면 그 200byte와 값을 그대로 전달받음
                         받은 값을 수정 가능
        (time *t) 하면 주소값만 가지고 오는것이므로 4byte가 되서 size가 적절해짐
                        const time *t를 한다면? 참조만 가능해진다.
         그러니까 값을 변경해야된다거나 그대로 전달받아야 할때는 &가 제일 좋다.
private:
     int hour,min,sec;
public:
     Time(int h,int m,int s) { hour=h;min=m;sec=s; }
};

void Date::OutToday(Time &t)
{
     printf("오늘은 %d년 %d월 %d일이며 지금 시간은 %d:%d:%d입니다.\n",
          year,month,day,t.hour,t.min,t.sec);
}

void main()
{
     Date D(2005,01,02);
     Time T(12,34,56);
     D.OutToday(T);
}
 
 
 
 
 
프렌드 멤버 함수를 알아보자!!
 
class Some
{
     ....
     friend void Any::func(Some &S);
};

이렇게 하면 Any 클레스의 func멤버만 Some에 엑세스가 가능해지지.
 
프렌드 멤버 함수를 알아보자!!endMem
#include

class Time;
class Date
{
private:
     int year,month,day;
public:
     Date(int y,int m,int d) { year=y;month=m;day=d; }
     void OutToday(Time &t);
};

class Time
{
     friend void Date::OutToday(Time &t); // Date의 OutToday만 Time &t와 친구먹는다.
private:
     int hour,min,sec;
public:
     Time(int h,int m,int s) { hour=h;min=m;sec=s; }
};

void Date::OutToday(Time &t)  // Date의 outToday에서 Time &t를 참조한다.
{
     printf("오늘은 %d년 %d월 %d일이며 지금 시간은 %d:%d:%d입니다.\n",
          year,month,day,t.hour,t.min,t.sec);
}

void main()
{
     Date D(2005,01,02);
     Time T(12,34,56);
     D.OutToday(T);   // Data에 OutToady에서만 Time클레스를 참조할수있다
}

댓글 없음: