// overridearithmeticoperatorandoverrideassignoperator.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
template <class T>
class Matrix
{
public:
// brief : 构造函数
// param : nil
Matrix(int row, int col)
{
m_m = new T[row * col];
m_row = row;
m_col = col;
}
// brief : 构造函数
// param : m 数据
// row 行数
// col 列数
Matrix(T *m, int row, int col)
{
m_m = new T[row * col];
m_row = row;
m_col = col;
memcpy_s(m_m, sizeof(T) * row * col, m, sizeof(T) * row * col);
}
// brief : 拷贝构造函数
// param : nil
Matrix(const Matrix &m)
{
m_m = new T[m.m_row * m.m_col];
m_row = m.m_row;
m_col = m.m_col;
memcpy_s(m_m, sizeof(T) * m.m_row * m.m_col, m.m_m, sizeof(T) * m.m_row * m.m_col);
}
// brief : 析构函数
// param : nil
~Matrix()
{
if(m_m)
delete m_m;
m_m = NULL;
m_row = 0;
m_col = 0;
}
// brief : 重载算术运算符
// param : v 常数
// return 当前矩阵乘以一个常数
Matrix<T> operator* (T v)// 重载算术运算符返回拷贝
{
int r = m_row, c = m_col;
Matrix<T> m(r, c);
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
m.e(i, j) = v * e(i, j);
return m;
}
// brief : 重载赋值运算符
// param : m 矩阵
// return 当前实例的引用
Matrix<T> &operator= (const Matrix<T> &m)// 重载赋值运算符返回引用
{
if(this == &m)
return *this;
realloc(m.m_row, m.m_col);
memcpy_s(m_m, sizeof(T) * m.m_row * m.m_col, m.m_m, sizeof(T) * m.m_row * m.m_col);
return *this;
}
// brief : 重载算术赋值运算符
// param : v 常数
// return 当前矩阵乘以一个常数
Matrix<T> &operator*= (T v)// 重载算术赋值运算符依然返回引用
{
int r = m_row, c = m_col;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
e(i, j) = v * e(i, j);
return *this;
}
public:
T *m_m;
int m_row;
int m_col;
};
int _tmain(int argc, _TCHAR* argv[])
{
// 定义和初始化2x2矩阵
float _M[4] = {0.1f, 0.2f, 0.3f, 0.4f};
Matrix<float> M(_M, 2, 2);
// 调用重载算术运算符,不更新矩阵本身
M * 2;
// 调用重载赋值运算符,更新矩阵本身
M = M;
// 调用重载算术赋值运算符,更新矩阵本身
M *= 2;
// 调用重载算术运算符,再调用重载赋值运算符,更新矩阵本身
M = M * 2;
return 0;
}
Q: 重载算术运算符的返回值应该是拷贝还是引用?
A: 拷贝
Q: 重载赋值运算符的返回值应该是拷贝还是引用?
A: 引用
Q: 重载算术赋值运算符的返回值应该是拷贝还是引用?
A: 引用