728x90
반응형
friend
friend 키워드는 private 멤버의 접근을 허용해 주는 선언이다.
friend 키워드는 클래스 내에 어디 존재하든 상관이 없다.
private 영역에 존재해도 되고 public 영역에 존재해도 상관없다는 의미이다.
따라서 아래 코드처럼 작성하는 것이 가능하다.
class Men {
private:
int age;
friend class Women;
public:
Men (int num = 0) : age(num) { }
};
위 코드처럼 Men class에서 Women class에 friend 선언을 해주면 Women class에서도 age에 접근하는 것이 가능하다.
따라서 아래 코드처럼 사용하는 것이 가능하다.
class Women {
private:
char name[20];
public:
Women (char* str) {
strcpy(name, str);
}
void PrintFriendData(Men &frn) {
cout << "His age is : " << age << endl;
}
};
class 명시
위에서 사용했던 코드를 기반으로 두 class에 서로 friend 선언을 해보겠다.
class Women;
class Men {
private:
int age;
friend class Women;
public:
Men(int num = 0) : age(num) { }
void PrintFriendData(Women& frn) {
cout << "Her name is : " << frn.name << endl;
}
};
class Women {
private:
char name[20];
public:
Women(char* str) {
strcpy(name, str);
}
friend class Men;
void PrintFriendData(Men& frn) {
cout << "His age is : " << frn.age << endl;
}
};
위 코드에서 Men class는 Women class 보다 먼저 선언되어 있다.
따라서 Men class에서는 Women 이 클래스 명임을 알 수 없기 때문에 class Women; 을 통해서
Women 이 클래스 이름임을 명시해줘야 한다.
함수를 대상으로 하는 friend 선언
함수를 대상으로 friend 선언을 하는 것도 가능하다.
함수를 대상으로 friend 선언을 하게 되면 해당 함수는 class 내부에서 선언되었다 하더라도 class의 멤버함수가 아니라
전역함수가 된다.
따라서 아래코드처럼 선언과 정리를 분리할 때에도 class를 명시해줄 필요가 없게 된다.
class Bag {
private:
int data;
public:
Bag(int i) : data(i) { }
friend Bag plusbag(const int& a,const int& b);
};
Bag plusbag(const int& a, const int& b) {
Bag temp(a+b);
return temp;
}
또한 사용할 때에도 아래 코드처럼 전역함수처럼 사용한다.
#include <iostream>
using namespace std;
class Bag {
private:
int data;
public:
Bag(int i) : data(i) { }
friend Bag plusbag(const int& a,const int& b);
void printdata() {
cout << data;
}
};
Bag plusbag(const int& a, const int& b) {
Bag temp(a+b);
return temp;
}
int main()
{
Bag a = plusbag(10, 5);
a.printdata();
return 0;
}
728x90
반응형
'C++ > C++ 문법' 카테고리의 다른 글
[C++] bool 자료형 (0) | 2024.09.30 |
---|---|
[C++] 단항 연산자 오버로딩 (전위, 후위 연산자 오버로딩) (0) | 2024.09.26 |
[C++] 연산자 오버로딩을 활용한 객체의 대입 (0) | 2024.09.24 |
[C++] 연산자 오버로딩 (멤버함수와 전역함수에 의한 연산자 오버로딩) (0) | 2024.09.24 |
[C++] 객체 내에서 static 변수, static 멤버함수 (0) | 2024.05.03 |