사자자리
[C++] 프렌드(friend) 본문
https://coding-leo.tistory.com/153
[C++] 연산자 오버로딩
연산자 오버로딩 함수 오버로딩 - 다른 매개변수의 데이터형을 가진, 같은 이름의 함수를 여러 개 정의할 수 있다. 연산자 오버로딩 - 오버로딩의 개념을 연산자까지 확장하여, 연산자에 다중
coding-leo.tistory.com
프렌드(friend)
- C++의 클래스에서 public에 선언된 함수 이외에도 private의 멤버로 접근할 수 있는 통로
- 함수를 어떤 클래스에 대해 프렌드로 만들면, 그 함수는 클래스의 멤버 함수들과 동등한 접근 권한을 가진다.
- 즉, 프렌드 함수는 어떤 클래스의 private의 멤버에 접근할 수 있게 된다.
프렌드 사용 이유
- 지금까지, 클래스의 private 멤버는 public에 선언된 함수를 통해서 유일하게 접근할 수 있었다.
- 어떤 클래스의 이항 연산자를 오버로딩하면 프랜드를 만들 필요성이 생긴다.
//main.cpp
#include <iostream>
#include "time.h"
using namespace std;
int main() {
Time t1(2, 30);
Time t2;
t2 = t1 * 3;
}
- 위의 경우처럼, Time 클래스 객체와 int형 변수의 연산을 통해 Time 클래스 객체에 값을 저장하려면, 두 변수가 모두 Time 클래스 객체가 아니므로 연산자 오버로딩으로는 해결할 수 없는 문제가 생긴다.
//time.h
#include <iostream>
#ifndef TIMEH
#define TIMEH
class Time {
private:
int hours, mins;
public:
Time();
Time(int, int);
void addHours(int);
void addMins(int);
Time operator+(Time&);
Time operator*(int); //operator*의 매개변수의 순서가 바뀌었을 때도 작동하게 하기 위해
void show();
~Time();
//operator*는 클래스 선언 안에서 선언되었지만, 멤버 함수가 아니다.(멤버 연산자 사용 X)
//operator*는 멤버 함수가 아니지만, 멤버 함수와 동등한 권한을 가진다.(private 멤버 변수에 접근 가능)
friend Time operator*(int n, Time& t) {
return t * n;
}
};
#endif // !TIMEH
//func.cpp
#include "time.h"
Time::Time() {
hours = mins = 0;
}
Time::Time(int h, int m) {
hours = h;
mins = m;
}
void Time::addHours(int h) {
hours += h;
};
void Time::addMins(int m) {
mins += m;
hours += mins / 60;
mins %= 60;
};
Time Time::operator+(Time& t) {
Time sum;
sum.mins = mins + t.mins;
sum.hours = hours + t.hours;
sum.hours += sum.mins / 60;
sum.mins %= 60;
return sum;
};
void Time::show() {
std::cout << hours << "시간 " << mins << "분" << std::endl;
}
Time::~Time() {
}
Time Time::operator*(int n) {
Time result;
long resultMin = hours * n * 60 + mins * n;
result.hours = resultMin / 60;
result.mins = resultMin % 60;
return result;
}
//main.cpp
#include <iostream>
#include "time.h"
using namespace std;
int main() {
Time t1(2, 30);
Time t2;
t2 = t1 * 3; //인자의 순서가 바뀌어도 된다.
cout << "방법1: ";
t2.show();
t2 = operator*(3, t1); //인자의 순서가 바뀌면 안 된다.
cout << "방법2: ";
t2.show();
return 0;
}
'C++ > C++ 이론' 카테고리의 다른 글
[C++] << 연산자 오버로딩 (0) | 2022.08.24 |
---|---|
[C++] 연산자 오버로딩 (0) | 2022.08.24 |
[C++] this 포인터와 클래스 객체 배열 (0) | 2022.08.17 |
[C++] 클래스 생성자와 소멸자 (0) | 2022.08.17 |
[C++] 추상화와 클래스 (0) | 2022.08.17 |
Comments