관리 메뉴

공부 기록장 💻

[C++] 연산자 함수에서 참조 리턴 (연산자 함수 중복 정의 - 삽입 >> 연산자와 이항 += 연산자) 본문

# Language & Tools/C++

[C++] 연산자 함수에서 참조 리턴 (연산자 함수 중복 정의 - 삽입 >> 연산자와 이항 += 연산자)

dream_for 2021. 6. 9. 20:47

 

 

사용자가 객체에 대한 연산자 함수를 사용하기 위해 연산자를 중복 정의하여 작성할 때,

연산자를 연속적으로 사용하기 위해서는 참조 리턴을 하도록 구현해야 한다.

 

 

다음의 Power 클래스의 두 객체 a와 b에 대한 연산을 살펴보자.

 

a<<3<<b-=1; 은 왼쪽부터 순서대로

a<<3

a<<b

a-=1

이 실행된다.

 

따라서 (5,5) -> (8,8) -> (11, 11) -> (10, 10) 으로 a의 멤버인 kick과 punch 변수가 차레대로 변경된다.

이 때 연속적으로 << 사용자 정의 연산자를 사용하기 위해서는 참조 리턴을 해주어야 한다는 것이다.

왼쪽 피연산자인 a의 kick과 punch값을 오른쪽 피연산자의 값에 따라 변경한 후, a의 자기 자신 객체를 리턴해주어야 변경된 a값에 다음 << 연산을 실행할 수 있다.

 

	Power a(5,5), b(3,3);
	
	a<<3<<b-=1;

#include <iostream>
using namespace std;

class Power{
	int kick, punch;
public:
	Power(int kick=0, int punch=0){this->kick=kick;this->punch=punch;}
	Power& operator << (Power a){
		this->kick+=a.kick;
		this->punch+=a.punch;
		return *this;
	}
	Power& operator<<(int n){
		this->kick+=n;this->punch+=n;
		return *this;
	}
	
	Power& operator -=(int n){
		this->kick-=n;this->punch-=n;
		return *this;
	}
	void show(){
		cout<<"kick="<<kick<<", punch="<<punch<<endl;
	}
};

int main(){
	Power a(5,5), b(3,3);
	
	a.show();
	b.show();
	cout<<endl;
	
	a<<3<<b-=1;
	
	a.show();
	b.show();
	cout<<endl;
	
}

 

 


#include <iostream>
using namespace std;

class Matrix{
	int arr[4];
public:
	Matrix(int a=0, int b=0, int c=0, int d=0){
		arr[0]=a;arr[1]=b;arr[2]=c;arr[3]=d;
	}
	Matrix& operator +=(Matrix m){
		for(int i=0;i<4;i++)
			arr[i]+=m.arr[i];
		return *this;
	}
	Matrix operator +(Matrix m){
		Matrix tmp;
		for(int i=0;i<4;i++)
			tmp.arr[i]=arr[i]+m.arr[i];
		return tmp;
	}
	bool operator ==(Matrix m){
		for(int i=0;i<4;i++)
			if(arr[i]!=m.arr[i]) return false;
		return true;
	}
	void show(){
		cout<<"Matrx = { ";
		for(int i=0;i<4;i++) cout<<arr[i]<<' ';
		cout<<"}"<<endl;
	}
	
};

int main(){
	Matrix a(1,2,3,4), b(2,3,4,5),c;
	a.show();b.show();c.show();
	cout<<endl;
	
	c=a+b; // c = (1+2, 2+3, 3+4, 4+5) = (3, 5, 7, 9)
	a.show();b.show();c.show();
	cout<<endl;
	
	a+=b+=c;
	// a= (1+2, 2+3, 3+4, 4+5) = (3, 5, 7, 9) => (3+3, 5+5, 7+7, 9+9) = (6, 10, 14, 18)
	// b= (2+3, 3+5, 4+7, 5+9) = (5, 7, 11, 14)
	a.show();b.show();c.show();
	
	if(a==b) cout<<"a and c are the same"<<endl;
}

 

c=a+b;

operator+() 가 실행된다.

 

a+=b+=c;

위는, b+=c 가 먼저 실행되고, 이후에 a+=(b+=c) 가 실행된다.

따라서 b matrix 값이 먼저 (5,8,11,14) 로 변경되고, 후에 이 변경된 b값이

a 에 대입된다.

 

728x90
반응형
Comments