2020년 7월 1일 수요일

연산자 재정의, 임시객체

연산자 재정의는 크게 두가지 방법이 있다. 하나는 클래스 멤버 함수로 정의하는 것이고, 다른 하나는 전역 필드에서 정의하는 것이다.

LP_STR& LP_STR::operator ==(LP_STR& input_1, LP_STR& input_2)

LP_STR& operator ==(LP_STR& input_1, LP_STR& input_2)

하지만 멤버 함수로 정의해도 충분하며, 굳이 외부에서 접근할 이유가 없으므로 후자는 잘 없다.

또한 모든 연산자가 두가지로 되는 것은 아니다.

=, ->, (), [] 은 클래스 멤버함수로만 가능하다.

문법은 operator뒤에 연산자로 간단하나, ++ 연산자의 전위, 후위는 외워야 한다.

object operator++(); // 전위

object operator++(int);// 후위

연산자 재정의를 지우는 방법은 아래처럼 한다.

Window(const Window& win) = delete;

연산자 정의시 파라미터로 들어오는 객체는 소멸자가 발동된다.

obect1 + obect2;

object1.operator+(object2)

라는 사실을 염두에 두면 이해가 빠를 것이다.

아래는 임시 객체에 대한 예시이다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

class Point

{

int x, y;

public:

Point(int _x = 0, int _y = 0) : x(_x), y(_y)

{

std::cout << x << " 생성자 호출\n" << std::endl;

}

Point(const Point& in_point) {

this->x = in_point.x;

this->y = in_point.y;

std::cout << this->x << " 레퍼런스 복사 생성자\n" << std::endl;

}

~Point() { std::cout << x <<" 소멸자 호출\n" << std::endl; }

Point operator+ (Point& var)

{

Point a = Point(this->x + var.x, this->y + var.y);

std::cout << x << " 덧셈 연산자\n" << std::endl;

return a;

}

const Point& operator= (const Point& var)

{

this->x = var.x; this->y = var.y;

std::cout << x << " 대입 연산자\n" << std::endl;

return *this;

}

};

int main()

{

setlocale(LC_ALL, "korean");

std::wcout << TEXT("================실험================") << std::endl;

Point pt1(10, 20);

Point pt2(20, 30);

(pt1 + pt2);

getchar();

}r

pt1 + pt2 에 아무것도 대입하지 않았지만 자동으로 복사 생성자가 생성이 된다.

이것은 컴파일러가 임시 객체를 만들고, 그 객체에 operator+ 의 리턴 객체을 복사하기 때문이다.

이 객체는 그 줄이 끝나고 바로 소멸된다.

하지만 객체를 만들지 않고 return 에 바로 생성자를 넣으면 임시객체에 생성자가 적용된다.

임시객체인 것은 변함 없어서 그 줄이 끝나면 사라진다.

return에 생성자를 넣고

Point a = (pt1 + pt2);

이런 식으로 코드를 짜면 임시객체가 대입는 것이기 때문에 대입연산자가 발동된다.

Point a = Point(10, 10);

이런 식이 생성자가 호출되는 것과는 다른 것이다.

상속시 주의해야할 점은 다음과 같다.

클래스가 상속받았을 경우 생성자, 소멸자, 연산자 관련 함수는 상속되지 않는다.

그래서 상속받는 클래스의 복사연산자를 재정의 할 때에는 상위 클래스의 복사 생성자를 호출해야한다.

댓글 없음:

댓글 쓰기

List