달력

11

« 2018/11 »

  •  
  •  
  •  
  •  
  • 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
  •  





연산자 오버로딩에 대해 알아 보았다, 하지만 아직 연산자 오버로딩에 대해 완벽하게 알고 있는 것 같진 않다.



그렇다면 저 구문에 대해서 실행을 해주고 싶다면 어떻게 해야 할까?
이런 부분에 대해서는 전역으로 연산자 오버로딩을 해 주어야 한다.


다음은 [] 연산자에 대해서 연산자 오버로딩을 해보자.

비슷한 내용이지만 이번엔 int가 아닌 객체를 직접 저장하는 배열이 존재한다고 하고,
조금 소스를 변경해 보자.

조금 길게 느껴질 수도 있겠지만 큰 틀은 비슷하다.
단지 객체를 담기 위한 클래스와,
배열 안에 들어갈 클래스를 나눈것 뿐이다.
스스로가 스스로를 담기 위해선,
*를 통해서 해야 될 것으로 생각된다.

다음은 대입 연산자(=)를 오버로딩 하는 것에 대해서 살펴 보자.
실제로 연산자 오버로딩이 이루어진 곳에,
p1=p2;
를 하게 되면 p2에 값이 p1으로 이동 된 것을 알 수 있는데,
실제로 이것은 디폴트 대입 연산자 오버로딩? 정도로 표현 할 수 있을 것이다.

어찌 보면 복사 생성자와 같은 맥락이지만,
당연히 기본적인 디폴트 대입 연산자는 얕은 복사가 이루어 진다.
무슨 의미인지 알겠는가?
완벽하게 해주기 위해선,
깊은 복사가 이루어 져야 한다는 것이다.

'프로그래밍 > C++' 카테고리의 다른 글

템플릿(template)  (0) 2010.04.04
임시 객체 생성  (0) 2010.04.04
연산자 오버로딩(operator overlonding)(2)  (0) 2010.04.04
연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
virtual(가상)  (0) 2010.04.03
Posted by 안식의후크






기존에 존재하는 +, ++, == 등의 연산자를 프로그래머가 중복 정의가 가능하다.

operator+, operator++ 등으로 오버로딩이 가능한데,

멤버 함수내에 선언할 수도 있고, friend 키워드를 사용해서 전역으로 사용 할 수도 있지만,

멤버 함수에 선언해서 사용하는 것에 대해서 먼저 살펴 보자.

연산자 오버로딩의 사용 예,


operator++을 보면 인자를 받지 않고 return *this를 해주고 있다.
설명이 필요 없을지도 모르겠지만, 멤버 함수 내에 선언되어 있는 존재이기 때문에 자신의x,y를 증가 시키고
*this를 넘겨 줌으로써 값을 받아 온다.
만약 *this를 쓰지 않고 return tmp; 같은 식으로 하게 된다면,
++(++p);의 경우,
++p(1증가);
다시 1 증가
총 2증가를 하게 되지만,

복사본을 사용한다면,
++(++p);의 경우,
++p(p의 복사본,1증가);
p의 값은 1 증가,
p의 복사본이 1증가,
결론은 1밖에 증가가 되지 않는다.
다음은 전역에 선언한 operator에 대해서 살펴 보자.

이 처럼 사용이 가능하지만,
가능하면 객체지향적인 코딩을 생각해서 멤버 변수에 연산자 오버로딩을 하는 것이 옳은 방법이라고 생각한다.


그리고 ++p와 p++에 대해서 차이점이 존재한다.
실제로는 선연산 , 후연산이지만 operator를 사용해서는 그 의미가 불문명 해지게 된다.
이럴 경우를 대비해
Point& operator++(); ++p와 같고,
Point& operator++(int); p++과 같다.
예제를 잠깐 보자.

하지만 이 방법에는 큰 문제점이 존재하는데,
위에서 언급 하였던
(++(++p))와
((p++)++)우리가 예상 했던 결과가 나오지 않는 다는 것이다.

연산자 오버로딩이 안되는 경우도 존재 하는데,
. .* :: ?: sizeof 는 할 수 없다고 한다.
마지막으로 주의점에 대해서 이야기 하겠다.
1. p+3;
이 부분은 p의 값들에 3을 더할 수도 있겠고,
또는 p에 3을 더해서 새로운 객체를 생성해서 리턴하는 것일 수도 있다.
즉 저 부분만 봐서는 어떤 일을 하는지 알 수 없다는 것이다. (직접 operator+함수를 보기 전까진.)

2. p+3*3;
연산자는 계산시에 우선 순위가 존재 한다.
만약 저렇게 연산자 오버로딩을 하였다고 하더라도, 순서는 *3 이후 +3을 하게 된다는 것이다.

3. void operator+(int val=10);
이 처럼 연산자 오버로딩은 디폴트 매개 변수를 가질 수 없다. 만약 가능하다면,
p+; 이런 구문이 나올지도 모르고 이는 분명 프로그래머가 원하는 방향은 아닐 것이다.

4. int operator+(int a, int b){ return a+b+3 }
이것 또한 안된다. 연산자 오버로딩을 하지 않은 (int)3+(int)4라는 기본 연산에 대해서 다시 오버로딩을 하는 것은 불가능하다.

마지막으로 전역으로 선언된 연산자 오버로딩과, 멤버 함수로 선언된 연산자 오버로딩은 조금의 불러오는 차이가 존재 하는데,

++p -> 멤버 함수의 경우( p.operator++(); ) 와 같고,
++p -> 전역 함수의 경우( operator++(p); ) 와 같다는 걸 기억해 두자.

'프로그래밍 > C++' 카테고리의 다른 글

임시 객체 생성  (0) 2010.04.04
연산자 오버로딩(operator overlonding)(2)  (0) 2010.04.04
연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
virtual(가상)  (0) 2010.04.03
함수 오버라이딩(overriding)  (0) 2010.04.03
Posted by 안식의후크