연재 완료/C++ Lang 이론

10-2. 연산자 오버로딩 (1)

라이피 (Lypi) 2018. 7. 10. 02:45
반응형

PART 2. 객체 지향 프로그래밍

  - chapter 10. 프렌드와 연산자 중복


Ⅰ 연산자 중복 기본사항


1. C++의 연산자는 각 기본형들에 대해 동작이 미리 정의된 함수라고 볼 수 있다 .
2. 클래스는 또한 사용자 정의형이므로 연산자를 이용한 연산이 가능하면 좋을 것이다.
3. 이를 위한 메커니즘이 연산자 오버로딩이다.

4. 다만 새로운 연산자를 만드는 것은 허용되지 않는다.
5. 기본형에 대한 연산을 재정의하는 것은 허용되지 않는다.
6. 연산자들의 우선순위나 결합 법칙은 변경되지 않는다.
7. 단항 연산자를 이항 연산자로 재정의하거나, 이항연산자를 단항연산자로 만들 수는 없다.
8. .(멤버 선택 연산자), .*(멤버 포인터 선택 연산자), ::(범위 확인 연산자), ?:(조건 연산자)는 중복정의가 불가능하다.
9. =(대입 연산자), ()(함수 호출 연산자), [](배열 원소 참조 연산자), ->(멤버 참조 연산자)는 멤버 함수로만 중복 정의가 가능하다.

10. 원래의 연산자의 의미를 크게 벗어나지 않도록 중복 정의하는 것이 좋다.

11. 연산자 중복이 가능한 연산자 참조 (MSDN, 위키피디아)

Ⅱ. 연산자 중복 문법

반환형 operator기호 (매개 변수 목록)
{ 내용 }

예)
int operator+ (int a2)
{ 내용 }


1. 연산자는 멤버 함수로 정의할 수도 있고, 전역 함수로 정의할 수도 있다.


---- 자세한 내용은 다음으로 미룸.


Header.h

#pragma once

#include <iostream>
#include <string>
#include <ctime>
#include <tchar.h>


using std::cout;
using std::cin;
using std::endl;
using std::string;

matrix.h

#pragma once
#include "Header.h"


class matrix
{
private :
	int row;
	int column;
	int** number;

public:
	void setMat();
	void showMat();

	int getRow() { return row; }
	int getColumn() { return column; }

	matrix();
	matrix(int r, int c);
	matrix(const matrix &obj);


	bool operator==(const matrix& m2) const;
	bool operator!=(const matrix& m2) const;

	matrix operator+ (const matrix& m2);
	matrix operator- (const matrix& m2);
	matrix operator* (const matrix& m2);
//	matrix operator/ (matrix& v2);

	matrix operator* (int mag) const; // p2=p1*2;
	matrix operator/ (int div) const; // p2=p1/2;	

	friend matrix operator* (int mag, const matrix &pt); 
	friend matrix operator/ (int div, const matrix &pt); 

	matrix& operator=  (const matrix& m2);
	matrix& operator+= (const matrix& m2);
	matrix& operator-= (const matrix& m2);
	matrix& operator*= (int mag);
	matrix& operator/= (int div);



	int &operator[](int index);

	virtual ~matrix();
};

matrix.cpp

#include "matrix.h"



matrix::matrix()
{
	row = 0;
	column = 0;
}

matrix::matrix(int r, int c)
{
	row = r;
	column = c;

	number = new int*[row];
	for (int iCnt = 0; iCnt < row; iCnt++) {
		number[iCnt] = new int[column];
	}

	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			number[iCnt][kCnt] = 0;
		}
	}

}


matrix::~matrix()
{
	for (int iCnt = 0; iCnt < row; iCnt++) {
		 delete[] number[iCnt];
	}
}


void matrix::setMat()
{
	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			printf("%d행%d열의 숫자를 입력하세요 : ",iCnt, kCnt);
			cin >> number[iCnt][kCnt];
		}
	}
}

void matrix::showMat()
{
	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			printf("%3d", number[iCnt][kCnt]);
		}
		cout << endl;
	}
}

//복사 생성자
matrix::matrix(const matrix &obj)
{
	row = obj.row;
	column = obj.column;

	number = new int*[row];
	for (int iCnt = 0; iCnt < row; iCnt++) {
		number[iCnt] = new int[column];
	}

	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			number[iCnt][kCnt] = obj.number[iCnt][kCnt];
		}
	}
}



//비교 연산자
bool matrix::operator== (const matrix& m2) const
{
	if (row != m2.row || column != m2.column) { return false; }

	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			if (number[iCnt][kCnt] != m2.number[iCnt][kCnt]) {
				return false;
			}
		}
	}

	return true;
}

bool matrix::operator!= (const matrix& m2) const
{
	return !(*this == m2);
}

//사칙연산
matrix matrix::operator+ (const matrix& m2)
{
	if (row == m2.row && column == m2.column) {
		matrix mr(row, column);

		for (int iCnt = 0; iCnt < row; iCnt++) {
			for (int kCnt = 0; kCnt < column; kCnt++) {
				mr.number[iCnt][kCnt] =	number[iCnt][kCnt] + m2.number[iCnt][kCnt];
			}
		}
		return mr;
	}
	else
	{
		cout << "크기가 맞지 않습니다." << endl;
		return *this;
	}
}

matrix matrix::operator- (const matrix& m2)
{
	if (row == m2.row && column == m2.column) {
		matrix mr(row, column);

		for (int iCnt = 0; iCnt < row; iCnt++) {
			for (int kCnt = 0; kCnt < column; kCnt++) {
				mr.number[iCnt][kCnt] = number[iCnt][kCnt] - m2.number[iCnt][kCnt];
			}
		}
		return mr;
	}
	else
	{
		cout << "크기가 맞지 않습니다." << endl;
		return *this;
	}
}
matrix matrix::operator* (const matrix& v2)
{
	if (column == v2.row) {
		matrix mr(row, v2.column);

		for (int iCnt = 0; iCnt < row; iCnt++) {
			for (int kCnt = 0; kCnt < v2.column; kCnt++) {
				for (int jCnt = 0; jCnt < column; jCnt++) {
					mr.number[iCnt][kCnt] += number[iCnt][jCnt] * v2.number[jCnt][kCnt];
				}
			}
		}
		return mr;
	}
	else {
		cout << "크기가 맞지 않습니다." << endl;
		return *this;
	}

}
//matrix operator/ (matrix& v2)
//{ TODO : 역행렬
//}
//


//실수배
matrix matrix::operator* (int mag) const
{
	matrix mr(row, column);

	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			mr.number[iCnt][kCnt] = number[iCnt][kCnt] * mag;
		}
	}
	return mr;
}


matrix matrix::operator/ (int div) const
{
	matrix mr(row, column);

	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			mr.number[iCnt][kCnt] = number[iCnt][kCnt] / div;
		}
	}
	return mr;
}

matrix operator*(int mag, const matrix &mt)
{
	matrix mr(mt.row, mt.column);

	for (int iCnt = 0; iCnt < mt.row; iCnt++) {
		for (int kCnt = 0; kCnt < mt.column; kCnt++) {
			mr.number[iCnt][kCnt] = mt.number[iCnt][kCnt] * mag;
		}
	}
	return mr;
}
matrix operator/ (int div, const matrix &mt)
{
	matrix mr(mt.row, mt.column);

	for (int iCnt = 0; iCnt < mt.row; iCnt++) {
		for (int kCnt = 0; kCnt < mt.column; kCnt++) {
			mr.number[iCnt][kCnt] = mt.number[iCnt][kCnt] / div;
		}
	}
	return mr;
}



//대입 연산자
matrix& matrix::operator= (const matrix& v2)
{
	row = v2.row;
	column = v2.column;

	number = new int*[row];
	for (int iCnt = 0; iCnt < row; iCnt++) {
		number[iCnt] = new int[column];
	}

	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			number[iCnt][kCnt] = v2.number[iCnt][kCnt];
		}
	}

	return *this;
}

matrix& matrix::operator+= (const matrix& m2)
{
	if (row == m2.row && column == m2.column) {

		for (int iCnt = 0; iCnt < row; iCnt++) {
			for (int kCnt = 0; kCnt < column; kCnt++) {
				number[iCnt][kCnt] = number[iCnt][kCnt] + m2.number[iCnt][kCnt];
			}
		}
		return *this;
	}
	else
	{
		cout << "크기가 맞지 않습니다." << endl;
		return *this;
	}
}
matrix& matrix::operator-= (const matrix& m2)
{
	if (row == m2.row && column == m2.column) {

		for (int iCnt = 0; iCnt < row; iCnt++) {
			for (int kCnt = 0; kCnt < column; kCnt++) {
				number[iCnt][kCnt] = number[iCnt][kCnt] - m2.number[iCnt][kCnt];
			}
		}
		return *this;
	}
	else
	{
		cout << "크기가 맞지 않습니다." << endl;
		return *this;
	}
}

matrix& matrix::operator*= (int mag)
{
	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			number[iCnt][kCnt] = number[iCnt][kCnt] * mag;
		}
	}
	return *this;
}

matrix& matrix::operator/= (int div)
{
	for (int iCnt = 0; iCnt < row; iCnt++) {
		for (int kCnt = 0; kCnt < column; kCnt++) {
			number[iCnt][kCnt] = number[iCnt][kCnt] / div;
		}
	}
	return *this;
}

int& matrix::operator[](int index)
{
	if (index / 10 > row || index % 10 > column) {
		return number[0][0];
	}
	return number[index / 10][index % 10];
}

main.cpp

#include "matrix.h"

int main()
{
	
	matrix m1(2, 2); m1.setMat();
	matrix m2(2, 2); m2.setMat();
	matrix m3(1, 1); m3.setMat();

	cout << (m1 == m2) << endl;
	cout << (m1 != m3) << endl;
	
	cout << m1[01] << endl;
	cout << m3[00] << endl;
}


반응형