C++ 开发之实现操作符重载的实例

C++操作符重载

实现效果图:

实例代码:

Matrix.h

#pragma once
#include "vector"
#include "iostream"
#define rep(i,n) for(int i=1;i<=n;i++) //宏定义for循环,精简代码
using namespace std;
class Matrix
{
public:
  //基本构造函数
  Matrix(int Row=0, int Column=0);
  //拷贝构造函数或者复制构造函数
  Matrix(const Matrix& matrix);
  //赋值操作符重载,必须为成员函数,不然会报错
  Matrix& operator=(const Matrix& matrix);
  //复合赋值操作符重载,建议重载为成员函数
  Matrix& operator+=(const Matrix& matrix);
  Matrix& operator*=(const Matrix& matrix);
  Matrix& operator*=(const float& number);
  Matrix& operator*=(const int& number);
  Matrix& operator-=(const Matrix& matrix);
  Matrix& operator/=(const float& number);
  float& operator[](const size_t& index);
  Matrix& operator++();//前缀式自增
  Matrix& operator--();//前缀式自减
  Matrix operator++(int); //后缀式自增
  Matrix operator--(int); //后缀式自减
  //算术和关系操作符一般为非成员函数,声明为友元
  friend Matrix operator+(const Matrix& matrix1, const Matrix& matrix2);
  friend Matrix operator-(const Matrix& matrix1, const Matrix& matrix2);
  friend Matrix operator*(const Matrix& matrix1, const Matrix& matrix2);
  friend Matrix operator*(const Matrix& matrix1, const float& number);
  friend Matrix operator*(const Matrix& matrix1, const int& number);
  friend bool operator==(const Matrix& matrix1, const Matrix& matrix2);
  friend bool operator!=(const Matrix& matrix1, const Matrix& matrix2);
  //输出操作符<<的重载,必须声明为友元
  friend ostream& operator<<(ostream& os, const Matrix&object);
  //输入操作符>>重载,必须声明为友元
  friend istream& operator >>(istream& in,Matrix&object);
  void Display();
  ~Matrix();
public:
  int Row;
  int Column;
  vector<vector<float> > data; //二维vector,用于存放矩阵类数据
};

Matrix.cpp

#include "stdafx.h"
#include "Matrix.h"
#include "iomanip"
//构造函数
Matrix::Matrix(int Row/* =0 */, int Column/* =0 */){
  this->Row = Row;
  this->Column = Column;
  data.resize(Row + 1); //申请行数为row+1,0号位不用
  rep(i, Row)
    data[i].resize(Column + 1); //申请各行的列数
  rep(i, Row)
    rep(j, Column)
    data[i][j] = 0; //每个元素初始化为0,方便后面计算
}
//打印函数
void Matrix::Display(){
  rep(i, Row)
  {
    rep(j, Column)
      cout << setw(8) << data[i][j] << ' ';
    cout <<endl;
  }
}
//拷贝构造函数
Matrix::Matrix(const Matrix& matrix){
  Row = matrix.Row;
  Column = matrix.Column;
  data.resize(Row+1); //申请行数为row,0号位不用
  rep(i, Row)
    data[i].resize(Column+1); //申请各行的列数
  rep(i, Row)
    rep(j, Column)
    data[i][j] = matrix.data[i][j];
}
//赋值操作符重载
Matrix& Matrix::operator=(const Matrix& matrix){
  if (this==&matrix)
  {
    return *this;
  }
  Row = matrix.Row;
  Column = matrix.Column;
  //分配资源
  data.resize(Row + 1); //申请行数为row+1,0号位不用
  rep(i, Row)
    data[i].resize(Column + 1); //申请各行的列数
  rep(i, Row)
    rep(j, Column)
    data[i][j] = matrix.data[i][j];
  //返回本对象的引用
  return *this;
}
//复合赋值操作符重载
Matrix& Matrix::operator+=(const Matrix& matrix){
  if (Row == matrix.Row&&Column == matrix.Column)
  {
    rep(i, Row)
    {
      rep(j,Column)
      {
        data[i][j] += matrix.data[i][j];
      }
    }
  }
  return *this;
}
Matrix& Matrix::operator-=(const Matrix& matrix){
  if (Row == matrix.Row&&Column == matrix.Column)
  {
    rep(i, Row)
    {
      rep(j, Column)
      {
        data[i][j] -= matrix.data[i][j];
      }
    }
  }
  return *this;
}
Matrix& Matrix::operator*=(const float& number){
  rep(i, Row)
  {
    rep(j, Column)
    {
      data[i][j] = data[i][j] * number;
    }
  }
  return *this;
}
Matrix& Matrix::operator*=(const int& number){
  rep(i, Row)
  {
    rep(j, Column)
    {
      data[i][j] = data[i][j] * number;
    }
  }
  return *this;
}
Matrix& Matrix::operator*=(const Matrix& matrix){
  //先保存矩阵的值
  Matrix temp(Row, Column);
  rep(i, temp.Row)
  {
    rep(j, temp.Column)
    {
      temp.data[i][j] = data[i][j];
    }
  }
  //改变矩阵的大小和值
  Column = matrix.Column;
  data.clear();    //清除数据
  data.resize(Row+1); //申请行数为row+1,0号位不用
  rep(i, Row)
    data[i].resize(Column+1); //申请各行的列数
  //重新给矩阵赋值
  rep(i, temp.Row)
  {
    rep(j, matrix.Column)
    {
      double sum = 0;
      rep(k, temp.Column)
        sum += temp.data[i][k] * matrix.data[k][j];
      data[i][j] = sum; //改变矩阵的值
    }
  }
  return *this;
}
Matrix& Matrix::operator/=(const float& number){
  rep(i, Row)
  {
    rep(j, Column)
    {
      data[i][j] = data[i][j] / number;
    }
  }
  return *this;
}
//前缀式自增
Matrix& Matrix::operator++(){
  //对每个元素都加1
  rep(i, Row)
  {
    rep(j, Column)
    {
      data[i][j] +=1;
    }
  }
  return *this;
}
//前缀式自减
Matrix& Matrix::operator--(){
  //对每个元素都减1
  rep(i, Row)
  {
    rep(j, Column)
    {
      data[i][j] -= 1;
    }
  }
  return *this;
}
//后缀式自增
Matrix Matrix::operator++(int){
  //拷贝构造函数
  Matrix ret(*this);
  //对每个元素都加1
  rep(i, Row)
  {
    rep(j, Column)
    {
      data[i][j] += 1;
    }
  }
  return ret;
}
//后缀式自减
Matrix Matrix::operator--(int){
  //拷贝构造函数
  Matrix ret(*this);
  //对每个元素都减1
  rep(i, Row)
  {
    rep(j, Column)
    {
      data[i][j] -= 1;
    }
  }
  return ret;
}
//析构函数
Matrix::~Matrix()
{
  data.clear();
}
//加法操作符重载
Matrix operator+(const Matrix& matrix1, const Matrix& matrix2){
  Matrix temp(matrix1.Row, matrix1.Column);
  if (matrix1.Row == matrix2.Row&&matrix1.Column == matrix2.Column)
  {
    rep(i, matrix1.Row)
    {
      rep(j, matrix2.Column)
      {
        temp.data[i][j] = matrix1.data[i][j]+matrix2.data[i][j];
      }
    }
  }
  return temp;
}
//减法操作符重载
Matrix operator-(const Matrix& matrix1, const Matrix& matrix2){
  Matrix temp(matrix1.Row, matrix1.Column);
  if (matrix1.Row == matrix2.Row&&matrix1.Column == matrix2.Column)
  {
    rep(i, matrix1.Row)
    {
      rep(j, matrix2.Column)
      {
        temp.data[i][j] = matrix1.data[i][j] - matrix2.data[i][j];
      }
    }
  }
  return temp;
}
//乘法操作符重载
Matrix operator*(const Matrix& matrix1, const Matrix& matrix2){
  Matrix temp(matrix1.Row, matrix2.Column);
  rep(i, temp.Row)
  {
    rep(j, temp.Column)
    {
      double sum = 0;
      rep(k, matrix1.Column)
        sum += matrix1.data[i][k] * matrix2.data[k][j];
      temp.data[i][j] = sum;
    }
  }
  return temp;
}
//乘法操作符重载
Matrix operator*(const Matrix& matrix1, const float& number){
  Matrix temp(matrix1.Row, matrix1.Column);
  rep(i, temp.Row)
  {
    rep(j, temp.Column)
    {
      temp.data[i][j] = matrix1.data[i][j]* number;
    }
  }
  return temp;
}
//乘法操作符重载
Matrix operator*(const Matrix& matrix1, const int& number){
  Matrix temp(matrix1.Row, matrix1.Column);
  rep(i, temp.Row)
  {
    rep(j, temp.Column)
    {
      temp.data[i][j] = matrix1.data[i][j] * number;
    }
  }
  return temp;
}
//等于关系操作符重载
bool operator==(const Matrix& matrix1, const Matrix& matrix2){
  //只有维数相等才有可比性
  if (matrix1.Row==matrix2.Row&&matrix1.Column==matrix2.Column)
  {
    rep(i, matrix1.Row)
    {
      rep(j, matrix1.Column)
      {
        if (matrix1.data[i][j]!=matrix2.data[i][j])
        {
          return false;
        }
      }
    }
    return true;
  }
  else
  {
    return false;
  }
}
//不等于关系操作符重载
bool operator!=(const Matrix& matrix1, const Matrix& matrix2){
  //只有维数相等才有可比性
  if (matrix1.Row == matrix2.Row&&matrix1.Column == matrix2.Column)
  {
    rep(i, matrix1.Row)
    {
      rep(j, matrix1.Column)
      {
        if (matrix1.data[i][j] != matrix2.data[i][j])
        {
          return true;
        }
      }
    }
    return false;
  }
  else
  {
    return false;
  }
}
//输出操作符重载
ostream& operator<<(ostream& os, const Matrix&object){ 

  rep(i, object.Row)
  {
    rep(j, object.Column)
      os << setw(8) << object.data[i][j] << ' ';
    os <<endl;
  }
  return os;
}
//输入操作符重载
istream& operator >>(istream& in, Matrix&object){
  rep(i, object.Row)
    rep(j, object.Column)
    in >> object.data[i][j];
  return in;
}

main.c

#include "iostream"
#include "Matrix.h"
using namespace std;
int main(){
  int row1, row2, col1, col2;
  cout << "请输入第一个矩阵的行和列:\n";
  cin >> row1 >> col1;
  Matrix m1(row1, col1);
  cout << "请输入" << row1 << '*' << col1 << "个数:\n";
  cin >> m1;
  cout << "输出矩阵的值:\n";
  cout << m1;
  cout << "请输入第二个矩阵的行和列:\n";
  cin >> row2 >> col2;
  Matrix m2(row2, col2);
  cout << "请输入" << row2 << '*' << col2 << "个数:\n ";
  cin >> m2;
  cout << "输出矩阵的值:\n";
  cout << m2;
  if (col1 != row2)
    cout << "这两个矩阵无法相乘\n";
  else
  {
    cout << "判断矩阵m1与m2是否相等:\n";
    if (m1==m2)
    {
      cout << "m1和m2相等:\n";
    }
    else
    {
      cout << "m1和m2不相等:\n";
    } 

    cout << "m1拷贝构造m3矩阵结果输出:\n";
    Matrix m3(m1);
    cout << m3; 

    cout << "m1赋值重载m4矩阵结果输出:\n";
    Matrix m4(m1.Row,m1.Column);
    m4 = m1;
    cout << m4; 

    cout << "m1*m2矩阵相乘输出m5:\n";
    Matrix m5(m1.Row, m2.Column);
    m5 = m1*m2;
    cout << m5; 

    cout << "矩阵m1*2输出m6:\n";
    Matrix m6(m1.Row, m1.Column);
    m6 = m1*2;
    cout << m6; 

    cout << "矩阵m1*0.5输出m7:\n";
    Matrix m7(m1.Row, m1.Column);
    m7 = m1 * 0.5;
    cout << m7; 

    cout << "m1*m2矩阵相乘输出m1:\n";
    m1 *= m2;
    cout << m1; 

    cout << "m1矩阵前自增输出\n";
    cout << ++m1; 

    cout << "m1矩阵后自增输出\n";
    cout << m1++; 

    cout << "m1矩阵输出\n";
    cout << m1; 

    cout << "m1矩阵前自减输出\n";
    cout << --m1; 

    cout << "m1矩阵后自减输出\n";
    cout << m1--; 

    cout << "m1矩阵输出\n";
    cout << m1;
  }
  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 浅谈C++虚重载操作符 virtual operator= 的使用方法

    C++中虚操作符和其他虚函数的规则一样,操作符可以为虚函数,进行动态绑定, 虽然这种情况并不多见.本文以赋值操作符operator=举例. 派生类中要重定义基类虚函数,要注意参数必须为基类引用类型,否则与基类中虚函数是完全不同的,无法进行预期的动态绑定. 派生类除了重定义基类的虚操作符,还要定义自身的操作符重载.即派生层次每增加一层,理论上派生类就需要多定义一个操作符重载. 以下程序使用引用reference,通过指针调用赋值操作符(例:*p = value)情况是一样的. #include <

  • C++中的操作符重载详细解析

    一.什么是操作符重载操作符重载可以分为两部分:"操作符"和"重载".说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符.我们不妨先直观的看一下所谓的操作符重载: 复制代码 代码如下: #include <iostream> using namespace std; int main(){    int a = 2 , b = 3;    float c =

  • C++ new、delete(new[]、delete[])操作符重载需要注意的问题

    new.delete(new[].delete[])操作符的重载需要注意: 1.重载的 new.delete(或者 new[].delete[])操作符必须是类的静态成员函数(为什么必须是静态成员函数,这很好理解,因为 new 操作符被调用的时候,对象还未构建)或者是全局函数,函数的原型如下: 复制代码 代码如下: void* operator new(size_t size) throw(std::bad_alloc); // 这里的 size 为分配的内存的总大小 void* operato

  • C++ 基础编程之十进制转换为任意进制及操作符重载

    C++ 基础编程之十进制转换为任意进制及操作符重载 最近学习C++ 的基础知识,完成十进制转换为任意进制及操作符重载,在网上找的不错的资料,这里记录下, 实例代码: #include<iostream> #include<vector> #include<limits> using namespace std; using std::iterator; ///<summary> ///十进制转换为任意进制,为了熟悉操作符,也加了操作符重载. ///包括自增(

  • C++之CNoTrackObject类和new delete操作符的重载实例

    本文实例讲述了C++中CNoTrackObject类和new delete操作符的重载,分享给大家供大家参考.具体如下: 头信息: 复制代码 代码如下: class CNoTrackObject{  public: //在此出过错,没有加public 默认为类的私有变量,MyThreadData继承这个类后也无法访问成员变量      void* operator new(size_t nSize);      void operator delete(void*);      virtual

  • C++中的三大函数和操作符重载(Boolan)

    C++中三大函数: 析构函数 复制构造函数 =操作符(copy assignment operator) 这三个特殊的成员函数如果程序员没有实现,编译器将提供默认的实现方式. 析构函数: 形如-foo_t(),函数名和构造函数相同,前面加-,如果对象是自由变量创建,析构函数将在脱离作用域时调用.如果对象是通过new操作符创建的,则通过delete操作符调用析构函数. 复制构造函数: 形如foo_t(const foo_t& foo),以下情况复制构造函数均会被调用: 当对象按值返回时候(retu

  • C++ operator关键字(重载操作符)的用法详解

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,"功能"都是由函数实现的). 一.为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等,

  • C++中复制构造函数和重载赋值操作符总结

    前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符的实现要点: 4.复制构造函数的一些细节. 复制构造函数和重载赋值操作符的定义 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类: 复制代码 代码如下: class CTes

  • C++输入输出操作符重载的深入分析

    操作符的重载有一些规则: 1. 重载操作符必须具有一个类类型或枚举类型操作数.这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义.如:int operator+(int, int), 不可以    2. 为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数.在某些情况下,程序没有选择,操作符必须是成员:在另外一些情况下,有些经验可以指导我们做出决定.下面是一些指导:a. 赋值(=),下标([]),调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些

  • C++ 开发之实现操作符重载的实例

    C++操作符重载 实现效果图: 实例代码: Matrix.h #pragma once #include "vector" #include "iostream" #define rep(i,n) for(int i=1;i<=n;i++) //宏定义for循环,精简代码 using namespace std; class Matrix { public: //基本构造函数 Matrix(int Row=0, int Column=0); //拷贝构造函数或

  • Ruby中对一元操作符重载实例

    一元操作大家都知道,就是表达式的操作符只有一个输入值.这个在C和Java中都很常见.今天我们要探讨一下Ruby中的一元操作符重载. 一元操作符有:+ – * ! & 等,为了避免与数值的 + – 混淆,重载一元操作符,要在后面加上一个 @ 操作符. 1. 一个简单的一元操作符重载例子:-@ 操作符 我们以String类为例子.String默认没有定义 – 操作符: 复制代码 代码如下: 1.9.3p125 :027 > a = "Hello" => "He

  • Kotlin操作符重载实例详解

    目录 算数运算操作符重载 复合运算操作符重载 一元运算操作符重载 比较操作符重载 集合和区域的约定 迭代运算符重载 解构声明 总结 算数运算操作符重载 在kotlin中我定义一个类 data class Point(val x: Int, val y: Int) 然后实例化两个对象 val p1 = Point(3,5) val p2 = Point(5,7) 想表示p1的元素x加上p2的元素x,p1的元素y,加上p2的元素y.然后输出一个p3. val p3 = Point(p1.x + p2

  • Python中操作符重载用法分析

    本文实例讲述了Python中操作符重载用法.分享给大家供大家参考,具体如下: 类可以重载python的操作符 操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook),python通过这种特殊的命名来拦截操作符,以实现重载. python在计算操作符时会自动调用这样的方法,例如: 如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法.通过重载,用户定义的对象就像内置的一样. 在类中重载操作符 1.操作符重载使得类能拦截标准的python操作. 2.类可

  • Python3 操作符重载方法示例

    基础知识 实际上,"运算符重载"只是意味着在类方法中拦截内置的操作--当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果.以下是对重载的关键概念的复习: 运算符重载让类拦截常规的Python运算. 类可重载所有Python表达式运算符 类可以重载打印.函数调用.属性点号运算等内置运算 重载使类实例的行为像内置类型. 重载是通过特殊名称的类方法来实现的. 换句话说,当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Pyt

  • python如何重载模块实例解析

    本文首先介绍了Python中的模块的概念,谈到了一个模块往往由多个模块组成,然后通过具体实例,分析了模块重载的相关内容,具体介绍如下. 模块是Python程序架构的一个核心概念,较大的程序往往以多个模块文件的形式呈现,一个模块被设计成主文件或顶层文件,用来启动整个Python程序.每个以.py为后缀的Python源代码文件都是一个模块,其他文件可通过"导入"读取这个模块的内容.从一般意义上讲,模块就是变量名的封装.如写一个模块test.py,包含一个两个变量名name.age. nam

  • Kotlin学习教程之操作符重载详解

    前言 在 Kotlin 中,我们可以用 约定的操作符,代替 调用代码中以特定的命名定义的函数,来实现 与之对应的操作.例如在类中定义了一个名为 plus 的特殊方法,就可以使用加法运算符 + 代替 plus() 的方法调用.由于你无法修改已有的接口定义,因此一般可以通过 扩展函数 来为现有的类增添新的 约定方法,从而使得 操作符重载 这一语法糖适应任何现有的 Java 类. 算术运算符 我们就从最简单直接的例子 + 这一类算术运算符开始. data class Point(val x: Int,

  • IOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解 在实际的开发需求时,有时候我们需要对某些对象进行打包,最后拼接到参数中 例如,我们把所有的参数字典打包为一个 字符串拼接到参数中 思路:利用系统系统JSON序列化类即可,NSData作为中间桥梁 //1.字典转换为字符串(JSON格式),利用 NSData作为桥梁; NSDictionary *dic = @{@"name":@"Lisi",@"sex":@"m",@"tel&qu

  • IOS 开发之读取addressbook的实现实例

    IOS 开发之读取addressbook的实现实例 iphone读取addressbook: 1.添加addressbook.framework 2.在需要的源文件中     #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> 3.开始粘代码: //get all people info from the address book ABAddressBookRef addressBo

随机推荐