핵심 개념

1.     연산자 함수: 연산자를 이용하듯 호출할 수 있는 메서드

2.     연산자 다중정의: 필요에 따라 연산자 함수를 다중 정의하는 것

 

학습 목표

1.     연산자와 연산자 함수의 차이

2.     연산자 함수의 다중 정의의 의미

3.     연산자 함수의 정의 및 선언 등

 

     

1.     연산자 함수: 연산자를 이용하듯 호출할 수 있는 메서드

     -       ? =>사용자가 훨씬 더 간결한 방법으로 코드 작성 코드의 확장성 (간결성, 확장성)

     -       절대로 논리 연산자들을 다중정의해서는 안된다.”

          ð  심각한 논리적 오류 왜?   

2.     산술 연산자

     -       산술 연산자일 경우 CMyData 형식을 반환

          ð  이동 생성자가 호출

          ð  이름 없는 임시 객체 호출

               Ø  산술 연산 후 원본 인스턴스는 결과가 바뀌면 안됨

               Ø  따라서, 임시객체를 생성하고 그 객체에 연산 결과를 저장, 리턴 후 소멸

          ð  CMyData& 로 반환 할 경우 ( a = b + c; )일 때,

               Ø  b + c 연산 결과 후 호출자 함수로 가면, 함수에서 계산된 값은 사라지고, (함수에서 생성된 객체는 함수 종료 후 사라지므로) 그 사라진 값의 주소를 반환하므로 a에는 원치 않는 결과를 대입하는 결과 발생

               ∴ 임시 객체를 의도적으로 생성

 

 

3.     대입 연산자 (4.3.1절 참고)

     -       대입 operator를 다중정의 할 때, 기존의 메모리를 삭제하고 새로 할당한 메모리에 새로운 데이터를 저장한다.

     -       그렇지 않을 경우 (메모리 차이로 인한) 데이터 손실 발생

     -       주의할 점

          n  위에 그대로 짤 경우, 자기 자신을 대입할 때( a = a; )

               u  자기 자신의 주소를 삭제하고 대입을 하게 된다.

               u  따라서, 먼저 자기 자신일 경우 그대로를 반환해주는 작업을 한다.

          n  대입, 즉 데이터 저장을 한다고 반환을 void형식으로 할 경우

               u  ( a = b = c; )에서 b = c에서 void를 반환하고, (a = void)가 되므로 논리적으로 옳지 않다.

               u  따라서 반환 형식을 CMyDat&로 전달한다.

A.     복합 대입 연산자

     -       ( += / -= etc..)

B.      이동 대입 연산자 ( != 대입연산자)

     i. ( a = b + c; )에서 b + c는 임시객체가 생성되고 그 임시객체를 대입 연산자를 실행하면 이동 대입 연산자 호출됨

     ii. 사라질 임시 객체에 대해 결과를 얕은 복사를 통해 주소만 지정해준다.

     ð  메모리의 효율성

     -       (4.3.3절 참고)

 

 

 

4.     배열 연산자

     -       배열의 개념

          n  주소에 옵셋을 수행하여 계산된 주소를 다시 간접 지정하여 정보를 읽거나 쓰는 일련의 과정” – 열혈강의 최호성의 C 프로그래밍 295.p

          n  위 개념에서 더 단순하게 작업하기 위해 [] 연산자를 생성함 == 배열

     -       , []이 연산자 이므로 다중정의 가능하다.

     -       Int& operator[] (int nIndex);

          n  일반적인 경우 이 연산자 함수가 사용됨

          n  r-value, l-value 모두 사용됨

     -       Int operator[] (int nIndex) const;

          n  상수형 참조일 경우만 호출됨

          n  R-value로만 사용됨

          n  (https://huiyu.tistory.com/entry/C-%EB%B0%B0%EC%97%B4-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%97%B0%EC%82%B0%EC%9E%90-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9)

     -       경계검사(bounds checking): 변수 사용되기 전에 어떤 경계 위치하는지를 검사하는 기법(위키백과)

     -       C,C++에서 기본배열은 경계검사를 하지 않음

5.     관계 연산자: 상등 및 부등 연산자 + 비교 연산자

     -       관계 연산 결과 자료형은 int

     -       실습 참고

 

 

6.     단항 증감 연산자

     -       (전위식): int operator++()

     -       (후위식): int operator++(int)

     -       후위 연산자가 가장 우선순위가 높음

우선순위

연산자

우선순위

연산자

1

x++
x--
( )
[ ]
.
->
(
자료형){}

9

^

2

++x
--x
+x
-x
!
~
(
자료형)
*x
&x
sizeof

10

|

3

*
/
%

11

&&

4

+
-

12

||

5

<<
>>

13

? :

6


<
<=
>
>=

14

=
+=
-=
*=
/=
%=
<<=
>>=
&=
^=
|=


7

==
!=

15

,

8

&

참고: https://dojang.io/mod/page/view.php?id=188

 

A.     예제 후위 연산 함수 설명

     n  후위 연산은 먼저 선언된 함수를 먼저 실행하고 후에 증가를 시키는 것이 목적

     ð  따라서, 후위식 증가 연산자에서 멤버 백업(int nData = m_nData;)를 하고,

     ð  백업한 값을 반환한다.

          Ø  보기에는 후위처리 연산을 하지만

          Ø  이미 인스턴스에선 값이 1 증가가 되었다.

 

 

연습문제

1.     대입 연산자 오버로딩 시 주의할 점 두가지 이유

     A.     자기 자신을 대입할 경우를 대비해야 한다.

          n  함수에서 기존의 데이터를 삭제하기 때문에

          n  자기 자신의 주소를 삭제하고 대입을 하게 된다.

     B.      void 형식으로 반환해서는 안된다.

          n  두 변수 이상 대입할 경우 ( a = b = c )

          n  a = void 형식이므로 적절하지 않다.

2.     각종 대입 연산자들의 적절한 반환 형식

     A.     자기 자신의 주소를 반환한다.

3.     후위식 단항 증가 연산자 작성(함수 원형을 예로)

     A.     int operator++(int);

'C++ > 이것이 C++이다.' 카테고리의 다른 글

Ch7. 상속 심화  (0) 2021.01.15
Ch6. 상속 기본  (0) 2021.01.15
Ch4. 복사 생성자와 임시 객체  (0) 2021.01.15
Ch3. 클래스  (0) 2021.01.15
Ch2. C++ 함수와 네임스페이스  (0) 2021.01.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기