- 不是所有的操作符都能重载,下面操作符不能重载
cpp
:: . ?: sizeof typeid
- 实现一个3*3的矩阵类,支持如下操作符:
- 运算类双目操作符:+ - *
- 赋值类双目操作符:+= -= *=
- 单目操作符:-(相反数)
- 输出操作符:<<
cpp
#include <iostream>
using namespace std;
class Mat33{
private:
int m_a[3][3];
public:
Mat33(void){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
m_a[i][j] = 0;
}
}
}
Mat33(int a[][3]){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
m_a[i][j] = a[i][j];
}
}
}
// + a+b
const Mat33 operator+(const Mat33& m) const{
int a[3][3] = {0};
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
a[i][j] = m_a[i][j] + m.m_a[i][j];
}
}
Mat33 result(a);
return result;
}
// - a-b
const Mat33 operator-(const Mat33& m) const{
int a[3][3] = {0};
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
a[i][j] = m_a[i][j] - m.m_a[i][j];
}
}
Mat33 result(a);
return result;
}
// * a*b
const Mat33 operator*(const Mat33& m) const{
int a[3][3] = {0};
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
for(int k=0; k<3; k++){
a[i][j] += m_a[i][k] * m.m_a[k][j];
}
}
}
Mat33 result(a);
return result;
}
// += a += b;
Mat33& operator+=(const Mat33& m){
*this = *this + m; // operator+
return *this;
}
// -= a -= b;
Mat33& operator-=(const Mat33& m){
*this = *this - m; // operator-(m)
return *this;
}
// *= a *= b;
Mat33& operator*=(const Mat33& m){
*this = *this * m; // operator*
return *this;
}
//-(取负) -a;
const Mat33 operator-(void) const{
Mat33 m;
return m - *this; // operator-(m)
}
/*
* os << a;
* */
friend ostream& operator<<(ostream& os, const Mat33& m){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
os << m.m_a[i][j] << " ";
}
cout << endl;
}
return os;
}
};
int main(void){
int a1[3][3] = {1,2,3,4,5,6,7,8,9};
int a2[3][3] = {9,8,7,6,5,4,3,2,1};
Mat33 m1(a1);
Mat33 m2(a2);
cout << m1 << endl;
cout << m2 << endl;
cout << "m1+m2: "<< endl;
cout << m1 + m2 << endl;
cout << "m1-m2: "<< endl;
cout << m1 - m2 << endl;
cout << "m1*m2: "<< endl;
cout << m1 * m2 << endl;
cout << "m1 += m2: "<< endl;
cout << (m1 += m2) << endl;
cout << "m1 -= m2: "<< endl;
cout << (m1 -= m2) << endl;
cout << "m1 *= m2: "<< endl;
cout << (m1 *= m2) << endl;
cout << "-m2" << endl;
cout << -m2 << endl;
return 0;
}