Automotive Software

연산자 중첩 본문

프로그래밍 (Programming)/C++ (C Plus Plus) 기초

연산자 중첩

AutoSW 2020. 12. 29. 02:10

C++에서 내장형 데이터 타입에 대한 연산 외에 클래스(사용자 정의 타입)에 대한 연산을 가능하게 하는 문법

C를 기반으로 생각해보면 동일 구조체 타입 변수들의 멤버 간 연산을 위해

  1. 멤버 접근을 위한 함수를 만들거나
  2. 멤버 접근 연산자를 사용하여 일일이 접근방식을 기술하여야 함

중첩 가능한 연산자들 : 아래의 연산자를 제외한 대부분 연산자의 중첩 가능함

  • The operators :: (scope resolution), . (member access), .* (member access through pointer to member), and ?: (ternary conditional) cannot be overloaded.(추가 내용 확인은 여기서)
  • 범위 지정 연산자, 멤버 접근 연산자, 멤버 접근 포인터 연산자, 그리고 조건 연산자는 중첩이 불가능함

연산자 중첩 방법 : 키워드 operator 사용

  • 전치 연산자(Prefix Operator)   : 반환형 operator op ()
  • 후치 연산자(Postfix Operator) : 반환형 operator op(정수형 매개 변수)
    • 컴파일러가 전치와 후치를 구분하지 못하므로 이를 위해 정수형 매개 변수 제공

연산자 함수 구현 방법

  • 클래스 멤버 함수로서 구현
  • 외부 함수로서 구현 후 클래스에 프렌드 함수로 선언
class cMyClass
{
public:
	cMyClass();
	~cMyclass();
	cMyClass operator++ ();
	cMyClass operator++ (int);
private:
	int memVar;
};

// 1. 전치 연산자
// 1.1 반환값 필요없는 경우
void operator++ () { ++memVar;}

// 1.2 반환값 필요한 경우 ; e.g.) cMyClass myCls2 = ++myCls1;
cMyClass operator++ ();

//   1.2.1 임시 객체 생성 후 사용	
cMyClass cMyClass::operator++ ()
{
	++memVar;
 	cMyClass tempClass;
 	tempClass.memVar = memVar;
 	return tempClass;
}

//   1.2.2 생성자 직접 호출을 통한 임시 객체 반환
cMyclass::cMyclass(int initVal): // 생성자 및 초기화
memVar(initVal)
{}

cMyClass cMyClass::operator++ ()
{
	++memVar;
	return cMyClass (memVar);
}

//   1.2.3 this 포인터 사용
//       클래스의 참조자를 반환하므로 추가 객체 생성 필요 없음
//       값을 전달하기만 하고 전달받는 함수에서 값 변경할 필요 없으니 상수(const)로 전달
//       클래스 내부 함수 선언시 타입 변경 필요
const cMyClass & cMyClass::operator++ ()
{
	++memVar;
	return *this;
}

// 2. 후치 연산자, 매개 변수가 전달되나 사용 안됨, 단지 후치 연산의 구분자 역활
cMyClass cMyClass::operator++ (int x)
{
	// 현재값 임시저장
	cMyClass tempCls(*this);
	// 연산 처리
	++memVar;
	// 임시저장값 반환
	return tempCls;
}

 

이 외에도 덧셈 연산자, 대입 연산자 그리고 변환 연산자도 중첩을 통해 클래스 연산을 위한 연산자로 사용할 수 있음

'프로그래밍 (Programming) > C++ (C Plus Plus) 기초' 카테고리의 다른 글

다형성 (Polymorphism)  (0) 2021.01.07
상속 (Inheritance)  (0) 2021.01.02
객체 초기화  (0) 2020.12.29
멤버함수 기본값 vs 멤버함수 중첩  (0) 2020.12.28
참조자  (0) 2020.12.28