학교 (업뎃X)/수업관련
C++ 프로그래밍:: operator overloading 실습 복습
나귀당
2021. 6. 9. 04:24
728x90
반응형
* 본 게시글은 실습 과제를 복습하기 위해 작성한 글입니다.
학부생 수준에서 부족한 점이 많으니 수정할 부분 있으면 꼭 말씀해주세요 */
문제
class Matrix {
int** values ;
int row, column ;
public:
} ;
int main() {
Matrix m1(2, 2), m2(2, 2) ;
cin >> m1 ;
cin >> m2 ;
Matrix m3(m1 + m2);
Matrix m4(2, 2);
m4 = m3 * 10 ;
cout << m3 << endl << m4 << endl ;
}
위의 스켈레톤을 완성해 보자.
해결 과정
만들어야 할 것
copy constructor / destructor / assignment operator
+ operator / * operator
>> operator / << operator
완성 코드
#include <iostream>
using namespace std;
class Matrix {
int** values;
int row, column;
void copyFrom(const Matrix& m) {
row = m.row;
column = m.column;
values = new int* [m.row];
for (int i = 0; i < m.row; i++) {
values[i] = new int[m.column];
for (int j = 0; j < m.column; j++) {
values[i][j] = m.values[i][j];
}
}
}
public:
Matrix(int r, int c) {
row = r;
column = c;
values = new int* [r];
for (int i = 0; i < r; i++) {
values[i] = new int[c];
}
}
Matrix(const Matrix& another) {
copyFrom(another);
}
~Matrix() {
for (int i = 0; i < row; i++) {
delete[] values[i];
}
delete[] values;
}
Matrix operator + (const Matrix& m) const {
Matrix temp(row, column);
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
temp.values[i][j] = values[i][j] + m.values[i][j];
}
}
return temp;
}
Matrix operator * (const int scalar) const {
Matrix temp(row, column);
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
temp.values[i][j] = values[i][j] * scalar;
}
}
return temp;
}
Matrix operator = (const Matrix& m) {
for (int i = 0; i < row; i++) {
delete[] values[i];
}
delete[] values;
copyFrom(m);
return *this;
}
friend ostream& operator << (ostream& os, const Matrix& m);
friend istream& operator >> (istream& is, Matrix& m);
};
ostream& operator << (ostream& os, const Matrix& m) {
for (int i = 0; i < m.row; i++) {
for (int j = 0; j < m.column; j++) {
os << m.values[i][j];
os << '\t';
}
os << endl;
}
return os;
}
istream& operator >> (istream& is, Matrix& m) {
for (int i = 0; i < m.row; i++) {
for (int j = 0; j < m.column; j++) {
is >> m.values[i][j];
}
}
return is;
}
int main() {
Matrix m1(2, 2), m2(2, 2);
cin >> m1;
cin >> m2;
Matrix m3(m1 + m2);
Matrix m4(2, 2);
m4 = m3 * 10;
cout << m3 << endl << m4 << endl;
}
문제 사항 및 해결
1. + operator와 * operator의 반환형에 &(reference)를 붙인 것
=> 이는 지역변수 temp를 참조하여 큰 오류 발생. 왜냐하면 함수가 끝나고 temp가 소멸되여 반환받는 것이 사라짐을 의미.
&를 때자 (처음에는 복잡하게 clone을 만들어서 반환함.)
2. assignment operator 사용시 delete로 포인터형 자료형을 reset 후 값을 넣어주어야 함!
=> 메모리가 낭비되지 않도록 주의!
중간고사 때 2차원 포인터 동적 할당을 못해서 망했는데 이때 실습 이후 그 부분에 대한 이해가 매우 나아진 것 같다.
728x90
반응형