일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 구조체배열
- AWS
- thymeleaf
- 시스템호출
- @Autowired
- spring boot
- 가상면접사례로배우는대규모시스템설계기초
- 해시
- Spring
- 알고리즘
- git
- python
- 카카오
- 코딩테스트
- 코테
- C언어
- 카카오 알고리즘
- nestjs typeorm
- 카카오 코테
- OpenCV
- C++
- 컴포넌트스캔
- nestjs auth
- 스프링
- Nodejs
- 프로그래머스
- 파이썬
- @Component
- TypeORM
- nestJS
Archives
- Today
- Total
공부 기록장 💻
[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
반응형
'# Language & Tools > C++' 카테고리의 다른 글
[C++] 챕터별 정리 (0) | 2021.06.07 |
---|---|
명품 C++ Programming 12장 실습 문제 - 텍스트/바이너리 파일 I/O (0) | 2021.06.03 |
[C++] 파일 입출력 (File I/O) - 텍스트/바이너리 파일 I/O, 파일 모드, 임의 접근, 파일 포인터 (0) | 2021.06.02 |
명품 C++ Programming 11장 실습 문제 - istream, ostream, cin.ignore(), cin.get(), 포맷 출력, 조작자, 포맷 함수, 사용자 정의 >> << 연산자 (0) | 2021.06.01 |
[C++] 명품 C++ Programming 9장 실습 문제 (0) | 2021.06.01 |
Comments