10. 클래스의 활용(1) - 연산자 오버로딩

WanJu Kim·2022년 12월 10일
0

C++

목록 보기
44/81

우리가 써왔던 연산자들도 사실은 오버로딩돼있었다. 여기선 클래스 간에 연산자 오버로딩 하는 방법을 알아보겠다. 오버로딩은 함수이므로 함수의 모형을 띄지만 약간 다르다. 가령 이런 식이다.

operator'op'()

operator은 연산자 오버로딩을 하겠다는 것이고, op 자리에 연산자가 들어오면 된다. 예를 들어 operator+(), operator-() 이렇게 쓰는 것이다. 연산자는 c++에 적합한 연산자여야 한다. 가령 operator@() 이런 건 안된다. operator[]() 이런 건 된다. 왜? []는 배열 인덱스 연산자이기 때문이다. () 안에는 매개 변수가 들어가면 된다. 전부터 써왔던 Student 클래스에 연산자 오버로딩을 해보겠다.

Student.h
class Student
{
public:
	...
	Student operator+(const Student& s);
private:
	...
};

Student.cpp
Student Student::operator+(const Student& s)
{
	Student temp;
	temp.name = this->name + s.name;
	temp.age = this->age + s.age;
	return temp;
}

Student 객체를 반환, 및 매개 변수로도 Student 객체를 받았다. 원본을 받는 게 복사본을 받는 것보다 더 빠르고 메모리 효율도 더 높다. 함수 내용은 학생 두 명의 이름을 연결, 나이는 더하는 것이다.

Student zzangoo("zzangoo",10,134.4f);
Student chulsoo("chulsoo",11,138.5f);
Student MsChae("ChaeSongWha",0,178.4f);
MsChae = zzangoo + chulsoo;	// 왼쪽이 함수를 호출한 객체, 오른쪽이 매개 변수 역할을 한다.
//MsChae = zzangoo.operator+(chulsoo) 와 같다.
cout << MsChae.GetName() << "의 나이 : " << MsChae.GetAge() << endl;

실행 결과.

원래는 없던 클래스 연산자 기능을 오버로딩을 넣어서 잘 구현해주었다.

두 개 이상의 객체들을 더할수 있을까? 예를 들어

s4 = s1 + s2 + s3;

은 가능한가? 만약 모두 한 클래스의 객체라면 말이다. 덧셈은 왼쪽에서 오른쪽으로 진행되니 위의 문구는

s4 = s1.operator+(s2 + s3);

와 같을 것이다. 다시 이는

s4 = s1.operator+(s2.operator+(s3));

와 같다. 이는 가능하다.

  • 오버로딩 제약
    모든 연산자가 다 오버로딩 가능한 것은 아니다. 연산자 기호를 새로 만들 수 없을 뿐만 아니라, 다음의 연산자들은 오버로딩이 불가능하다.
연산자설명
sizeofsizeof 연산자
.멤버 연산자
.*멤버 지시 포인터 연산자
::사용 범위 결정 연산자
?:조건 연산자
typeidRTTI 연산자
const_cast데이터형 변환 연산자
dynamic_cast데이터형 변환 연산자
reinterpret_cast데이터형 변환 연산자
static_cast데이터형 변환 연산자

또한 다음의 연산자들은 멤버 함수로만 오버로딩 가능하다.

연산자설명
=대입 연산자
()함수 호출 연산자
[]배열 인덱스 연산자
->클래스 멤버 접근 포인터 연산자
profile
Question, Think, Select

0개의 댓글