수업/C++

8,9연산자 다중정의

MDanderson 2024. 11. 25. 22:34

전위표기법 단항연산자

-형식 매개변수가없다.  즉 ( ) 안이 비었다는 말.

operator: 연산자를 다중정의하겠다는 말

매개변수가 공란이면 전위표기연산자를 의미함

바뀐 객체 자기자신을 리턴하고있음

 

IntClass1의 참조를 return함

 

호출방법

 


후위표기법 단항연산자

(int) : int형매개변수를 받겠다는 의미가아니라 후위표기법인 단항연산자라는 말

 

 

IntClass2 tmp(*this); 는 복사생성자

 

주의)

C++에서 복사 생성자는 사용자가 명시적으로 정의하지 않더라도, 컴파일러가 자동으로 기본 복사 생성자를 생성합니다. 따라서, IntClass2 tmp(*this);에서 기본 복사 생성자가 호출됩니다.

 

여기서는 참조를 반환하지 않았다. 왜냐면 tmp는 지역변수니까 이 안에서 동작하고 리턴값 내고 없어지는 객체임

참조를 쓰면 참조에 해당하는 객체가 없어지는문제가 생김 즉!!

  • tmp는 함수가 종료되면 자동으로 소멸되는 지역 변수입니다.
  • 만약 tmp 객체에 대한 참조를 반환하려고 하면, 함수가 종료된 뒤에는 참조 대상인 객체가 더 이상 유효하지 않게 되어 문제가 발생합니다.

 

호출방법

 


 

이항연산자의 다중정의

 

 

즉 a(좌측피연산자)+b(우측피연산자) 에서  a는 객체자기자신 b는 매개변수로 전달하는 arg라는 말

 

 

좌측피연산자가 자기자신이니까 *this임 우측피연산자는 매개변수로..

 

const : 첫번째 피연산자가 바뀌지않음.

const가 있으니 구현부에서도 바뀌지않게 구현해주는게 중요함

 

Complex2 tmp(*this) 는 묵시적 복사생성자호출

 

위방법을 아래 처럼 return ~ 한문장으로 대체가능하다.

 

 

 

 

 


좌측피연산자가 실수인경우,

첫번째매개변수가 좌측피연산자 두번째 매개변수가 우측피연산자로 정의함

클래스:: 기호가 없고 별도 연산자로 정의한다는 말이다.

 

private멤버사용하지 않게하기

friend : 함수또는 연산자다중정의내에서 private멤버를 자유롭게 접근하라는 의미

 

그러면 아래와같이 privte멤버에 접근가능

 

 

복합대입연산자

이것도 좌측피연산자가 *this  ,  우측피연산자가 매개변수

자기자신을 변화시키니까 const붙으면 안됨

 


스트림 출력 연산자의 다중정의

이항연산자라고 볼수있음 (좌측이 스트림객체고 우측이 출력할 값이 들어있는 객체)

cout이 Complex2의 객체가 아니고,

cout에 해당하는 ostream 클래스에 직접 정의할수는 없으니 특정 클래스에 속하지않은 외부의 연산자로 다중정의해야함

그리고 << 연산자가 private멤버를 엑서스할수있게 friend로 지정해야한다.

 

좌측피연산자 os   우측피연산자 c