#include <iostream>
#include <iomanip>
#include <ctime>
#include <string.h>
#include <typeinfo>
#include <windows.h>
#include <time.h>
#include <unistd.h>
#include <math.h>
#include <vector>
#include <algorithm>
#include "mystring.h"
using namespace std;
#define PI 3.14
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Matrix
{
public:
Matrix(void);
Matrix(int p[][3]);
Matrix(Matrix &matrix);
Matrix & operator =(const Matrix &matrix)
{
cout << this << "執行 = 函數:" << endl;
cout << "從這裡指派:" << &matrix << endl;
if (this == &matrix)
{
return *this;
}
int i;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
this->data[i][j] = matrix.data[i][j];
}
}
return *this;
}
Matrix operator +(Matrix &matrix)
{
Matrix tmp;
int i;
int j;
cout << this << "執行 + 函數:" << endl;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
tmp.data[i][j] = this->data[i][j] + matrix.data[i][j];
}
}
return tmp;
}
Matrix operator *(Matrix &matrix)
{
cout << this << "執行 *函數:" << endl;
int i;
int j;
int k;
Matrix tmp;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
for (k = 0; k < 3; k++)
{
tmp.data[i][j] += this->data[i][k] * matrix.data[k][i];
}
}
}
return tmp;
}
Matrix & operator +=(Matrix &matrix)
{
cout << this << "執行 += 函數:" << endl;
int i;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
this->data[i][j] += matrix.data[i][j];
}
}
return *this;
}
Matrix & operator *=(Matrix &matrix)
{
cout << this << "執行 *= 函數:" << endl;
int i;
int j;
int k;
Matrix tmp;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
for (k = 0; k < 3; k++)
{
tmp.data[i][j] += this->data[i][k] * matrix.data[k][i];
}
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
this->data[i][j] = tmp.data[i][j];
}
}
return *this;
}
void dis()
{
cout << this << "執行 dis() 函數: " << endl;
int i;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
cout << this->data[i][j] << " ";
}
cout << endl << endl;
}
cout << endl;
}
~Matrix()
{
cout << "destructor" << this << endl;
}
private:
int data[3][3];
};
Matrix::Matrix(void)
{
cout << "無參構造:" << this << endl;
int i;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
data[i][j] = 0;
}
}
}
Matrix::Matrix(int p[][3])
{
cout << "數組參數構造;" << this << endl;
int i;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
data[i][j] = p[i][j];
}
}
}
Matrix::Matrix(Matrix &matrix)
{
cout << "拷貝構造:" << this << endl;
int i;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
this->data[i][j] = matrix.data[i][j];
}
}
}
int main(int argc, char** argv)
{
// 測試無參構造函數
Matrix mat1;
cout << "mat1.dis()" << endl;
mat1.dis();
// 測試參數為二維數組的構造函數
int data[3][3] = {
1, 1, 1,
1, 1, 1,
1, 1, 1
};
Matrix mat2(data);
cout << "mat2.dis()" << endl;
mat2.dis();
// 測試拷貝構造函數
Matrix mat3(mat2);
cout << "mat3.dis()" << endl;
mat3.dis();
// 測試指派函數
Matrix mat4;
cout << "mat4.dis()" << endl;
mat4.dis();
mat4 = mat3;
cout << "mat4.dis()" << endl;
mat4.dis();
// 測試 "+" 運算符
Matrix mat5;
cout << "mat4 + mat3" << endl;
mat5 = mat4 + mat3;
cout << "mat5.dis()" << endl;
mat5.dis();
// 測試 "*" 運算符
Matrix mat6;
cout << "mat6 = mat4 * mat5";
mat6 = mat4 * mat5;
cout << "mat6.dis()" << endl;
mat6.dis();
cout << "Hello world" << endl;
// 測試 "*=" 運算符
cout << "mat6 *= mat5" << endl;
mat6 *= mat5;
cout << "mat5.dis()" << endl;
mat5.dis();
cout << "mat6.dis()" << endl;
mat6.dis();
// 測試 "+=" 運算符
cout << "mat4.dis()" << endl;
mat4.dis();
mat5 += mat4;
cout << "mat5.dis()" << endl;
mat5.dis();
return 0;
}