판다코딩 c++ friend함수

개발자는엉금엉금·2022년 9월 22일
0

💡friend함수란?

연산자 데이터형이 다를 때(가령, class와 int형타입) private멤버변수로 접근할 수 있는 함수

  • 이항 피연산자를 필요로 한다

📢 public에 선언하고, 멤버함수가 아니므로 '::' 사용 범위 결정연산자와 friend 키워드를 함수 정의부분에 사용하지 않는다.

💻time.h

#include <iostream>
#ifndef TIME
#define TIME
using namespace std;


class Time
{
private:
	int hours;
	int mins;
public:
	Time();
	Time(int, int);
	
    void show();
	~Time();
	friend Time operator*(int n, Time& t);
};
#endif

💻 func.cpp

#include "time.h"

Time::Time()
{
	hours = mins = 0;
}

Time::Time(int h, int m)
{
	hours = h;
	mins = m;
}


Time operator*(int n, Time& t)

{
	Time result;
	long resultMin = t.hours * n * 60 + t.mins * n;
	result.hours = resultMin / 60;
	result.mins = resultMin % 60;
	return result;
}

void Time::show()
{	
	cout << "시간:" << hours << endl;
	cout << "분:" << mins << endl;
	
}

Time::~Time()
{
}

  • resultMin으로 hours,mins에 n을 각각 곱해서 한꺼번에 저장한 다음, 몫연산자로 시간을, 나머지연산자로 분을 반환한다.

📢주의:friend함수는 private멤버변수에 직접 접근이 불가능하므로, 매개변수에 Time&를 넣는다.

💻 main.cpp

#include "time.h"

int main()
{	
	Time t1(1, 20);
	Time t2;

	t2 = t1 * 3;

	t2.show();
	
	return 0;
}

🤔operator*함수의 argument를 바꿔서 사용하면 error가 나는데, 이를 고칠 수는 없을까?

😄int를 매개변수로 받는 operator*함수를 멤버함수로, friend함수를 inline으로 처리하면 된다.

💻time.h

#include <iostream>
#ifndef TIME
#define TIME
using namespace std;


class Time
{
private:
	int hours;
	int mins;
public:
	Time();
	Time(int, int);
	Time operator*(int);
	
	void show();
	~Time();
	friend Time operator*(int n, Time& t)
	{
		return t * n;
	}
	//friend함수를 헤더부분에서 inline으로 처리
};
#endif

💻func.cpp

#include "time.h"

Time::Time()
{
	hours = mins = 0;
}

Time::Time(int h, int m)
{
	hours = h;
	mins = m;
}

Time Time :: operator*(int n)
{
	Time result;
	long resultMin = hours * n * 60 + mins * n;
	result.hours = resultMin / 60;
	result.mins = resultMin % 60;
	return result;
}

void Time::show()
{	
	cout << "시간:" << hours << endl;
	cout << "분:" << mins << endl;
	
}

Time::~Time()
{
}

💻main.cpp

#include "time.h"

int main()
{
Time t1(1, 20);
Time t2;

t2 = 3 * t1;

t2.show();

return 0;

}

    

0개의 댓글