※ operator overloading
- 하나의 이름으로 오버로딩 된 수만큼 다양한 기능을 제공해 주기에 연산자 오버로딩을 통해 기존 연산자 외의 다른 기능을 추가할 수 있다.
- 연산자 오버로딩에는 2가지 방법이 있다.
1. 멤버함수에 의한 방법
2. 전역함수에 의한 방법
1. pos1.operator+(pos2); // by 멤버함수
2. operator+(pos1, pos2); // by 전역함수
ex)
const Animal& a를 인자로 받지만 사실 내부적으로는 오른쪽처럼 this도 함께 인자로 받는다는 사실!
단, this는 컴파일러가 가정하기 때문에 직접 명시하지 않는다.
아래의 경우에는 operator를 멤버함수로 구현할 경우 operator의 인자는 2가지이다.
1. 직접 명시된 인자
2. 현재의 object(this) //컴파일러가 가정해서 직접 명시하지 않음
따라서 아래의 경우에도 내부적으로는 Animal& operator+(this, const Animal& a) {...} 가 된다.
위와 아래의 예제에서 출력의 차이가 발생하는 이유는 다음과 같다.
위의 예제의 경우, string이라는 변수에 this->name과 a.name이 합성된 값을 저장하고,
newName을 return하므로 dog.name즉, this의 값은 원래 값이 유지되는 것이다.
아래 예제의 경우, name+=a.name은 this의 name값을 인자 a의 a.name과 합성한 것이므로 dog객체의 this->name값이 변조되는 것이다.
cf. 멤버함수 기반으로만! overloading이 가능한 연산자
= 대입연산자
() 함수 호출 연산자
[] 배열 접근 연산자(Index 연산자)
-> 멤버 접근을 위한 포인터 연산자
이들은 객체를 대상으로 진행해야 의미가 있는 연산자 => 멤버함수 기반으로만 연산자 오버로딩을 허용한다.
- 구조
Point operator= (const Point& ref){
Point pos( . . . );
return pos;
}
※ 단항연산자 오버로딩 (ex. 증가,감소 연산자)
Point의 객체 pos에 대하여 ++pos;와 같은 표현은 아래와 같다.
i) pos의 멤버함수 호출형태: pos.operator++();
ii) 피연산자가 모두 인자로 전달되는 전역함수 형태: operator++(pos);
이때, i)에서 전달할 인자가 없는 이유는 단항연산자를 오버로딩해서 하나 있는 피연산자의 멤버함수를 호출하는 형태가 되어버렸기 때문이다.
cf) prefix, postfix 전후위 증감 오버로딩
※ 교환법칙
※ 대입연산자 class명& operator= (const class명& ref)
반드시 해야하는 연산자 오버로딩으로 복사생성자와 매우 유사하다.
i) 정의 하지 않으면 default 대입 연산자가 삽입된다.
ii) default 대입연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다.
iii) 연산자 내에서 동적할당, 깊은 복사가 필요하면 직접 정의 해야 한다.
class Point {
private:
int num1, num2;
public:
Point(int num1 = 0, int num2 = 0) : num1(num1), num2(num2) { }
void ShowPosition() { cout << num1 << ',' << num2 << endl; }
//default operator=
Point& operator= (const Point& ref){
num1 = ref.num1;
num2 = ref.num2;
return *this;
}
};
※ default 대입연산자의 문제.
두 객체가 동시에 참조하는 상황이 벌어지면?
- 주소값을 잃거나 객체 소멸과정에서 지워진 값을 중복소멸시키는 문제 발생
- 따라서 연산자 내에서 동적할당or깊은 복사가 필요하다면 직접 정의한다!
'C | C++ > C++' 카테고리의 다른 글
★this.code(8)_ type casting_ part 1. cast operator (★★★) (0) | 2022.10.29 |
---|---|
this.code(7)_ operator overloading_part2. copy function (0) | 2022.10.27 |
★★this.code(5)_ 상속, 가상함수(동적바인딩 / 오버라이딩 / 추상클래스), 다형성, 다중상속 (0) | 2022.10.25 |
★this.code(4)_ 복사생성자, 이동생성자, perfect forwarding, 임시객체, explicit, friend, static, mutable (0) | 2022.10.25 |
this.code(3)_ class, 객체생성과 소멸, *this (0) | 2022.10.25 |