학교 (업뎃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
반응형