双目运算符和单目运算符的重载

2024-04-09 19:12
文章标签 重载 运算符 双目 单目

本文主要是介绍双目运算符和单目运算符的重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

题目

源码

结果示例


 

题目

建立一个矩阵类,可以完成指定的操作或运算。

说明:

  1. 矩阵为2行3列,基类型为整型;
  2. 操作或运算:初始化(>>)、输出(<<)、赋值(=)、两个同类型矩阵的相加(+)、矩阵前置自增(++,即所有元素都加1)、矩阵后置自增(++,即所有元素都加1)、一个整数乘矩阵(*,即该整数乘以每个元素)、矩阵乘一个整数(*,即每个元素乘以该整数)。

要求:针对矩阵的各种操作,请先确认使用何种类型函数实现(仅限于成员函数、友元函数,暂不使用转换构造函数和类型转换函数)。

提示:运算符重载一般遵循如下原则:(1)=、[]、()、->必须作为成员函数;(2)<<、>>、类型转换运算符必须作为友元函数;(3)一般将单目运算符和复合运算符重载为成员函数;(4)一般将双目运算符重载为友元函数。

 

可以利用如下测试函数进行验证:

int main()
{Matrix a(1,2,3,4,5,6),b(6,5,4,3,2,1),c,d,e;int a1=2,a2=3;//用于测试数乘运算时用到的整数//(1)测试:>>,输入a和b//a的值如下://	1	1	1//	2	2	2//b的值如下://	3	2	1//	6	5	4cout<<"请输入a和b"<<endl;cin>>a>>b;cout<<"--------------------------"<<endl;//(2)测试:<<,输出a和b//输出结果格式://a的值如下:(b与a类似)//	1 1 1//	2 2 2cout<<"a的值如下:"<<endl;cout<<a<<endl;cout<<"b的值如下:"<<endl;cout<<b<<endl;cout<<"--------------------------"<<endl;//(3)测试:+,并输出a+b的结果cout<<"a+b的结果如下:"<<endl;cout<<a+b<<endl;cout<<"--------------------------"<<endl;//(4)测试:=,将a赋给c,并输出ccout<<"执行c=a之后,c的值如下:"<<endl;c=a;cout<<c;cout<<"--------------------------"<<endl;//(4)测试:整数左乘矩阵,计算a1*c并输出cout<<"测试整数左乘矩阵"<<endl;cout<<"整数为:"<<a1<<endl;cout<<"矩阵为:"<<endl<<c;cout<<"整数左乘矩阵结果如下:"<<endl;cout<<a1*c;cout<<"--------------------------"<<endl;//(5)测试:整数右乘矩阵,计算c*a2并输出cout<<"测试整数右乘矩阵"<<endl;cout<<"整数为:"<<a2<<endl;cout<<"矩阵为:"<<endl<<c;cout<<"整数右乘矩阵结果如下:"<<endl;cout<<c*a2;cout<<"--------------------------"<<endl;//(6)测试:前置自增++,计算d=++c并输出cout<<"测试前置自增++"<<endl;cout<<"c的初始值如下:"<<endl;cout<<c;cout<<"d=++c执行之后结果如下:"<<endl;d=++c;cout<<"c的结果如下:"<<endl;cout<<c;cout<<"d的结果如下:"<<endl;cout<<d;cout<<"--------------------------"<<endl;//(7)测试:后置自增++,计算e=c++并输出cout<<"测试后置自增++"<<endl;cout<<"c的初始值如下:"<<endl;c=a;cout<<c;cout<<"e=c++执行之后结果如下:"<<endl;e=c++;cout<<"c的结果如下:"<<endl;cout<<c;cout<<"e的结果如下:"<<endl;cout<<e;cout<<"--------------------------"<<endl;return 0;
}

源码

#include <iostream>using namespace std;class Matrix
{
private:int matrix[2][3];public:Matrix(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0, int f = 0){matrix[0][0] = a;matrix[0][1] = b;matrix[0][2] = c;matrix[1][0] = d;matrix[1][1] = e;matrix[1][2] = f;}friend istream& operator>>(istream& in, Matrix& m);friend ostream& operator<<(ostream& out, const Matrix& m);Matrix operator+(const Matrix& other);Matrix operator*(int num);friend Matrix operator*(int num, const Matrix& m);Matrix& operator=(const Matrix& other);Matrix& operator++();Matrix operator++(int);
};istream& operator>>(istream& in, Matrix& m)
{for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){in >> m.matrix[i][j];}}return in;
}ostream& operator<<(ostream& out, const Matrix& m)
{for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){out << m.matrix[i][j] << " ";}out << endl;}return out;
}Matrix Matrix::operator+(const Matrix& other)
{Matrix result;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){result.matrix[i][j] = matrix[i][j] + other.matrix[i][j];}}return result;
}Matrix Matrix::operator*(int num)
{Matrix result;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){result.matrix[i][j] = matrix[i][j] * num;}}return result;
}Matrix operator*(int num, const Matrix& m)
{Matrix result;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){result.matrix[i][j] = m.matrix[i][j] * num;}}return result;
}Matrix& Matrix::operator=(const Matrix& other)
{for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){matrix[i][j] = other.matrix[i][j];}}return *this;
}Matrix& Matrix::operator++()
{for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){matrix[i][j]++;}}return *this;
}Matrix Matrix::operator++(int)
{Matrix temp = *this;++(*this);return temp;
}int main()
{Matrix a(1, 2, 3, 4, 5, 6), b(6, 5, 4, 3, 2, 1), c, d, e;int a1 = 2, a2 = 3;//用于测试数乘运算时用到的整数//(1)测试:>>,输入a和b//a的值如下://	1	1	1//	2	2	2//b的值如下://	3	2	1//	6	5	4cout << "请输入a和b" << endl;cin >> a >> b;cout << "--------------------------" << endl;//(2)测试:<<,输出a和b//输出结果格式://a的值如下:(b与a类似)//	1 1 1//	2 2 2cout << "a的值如下:" << endl;cout << a << endl;cout << "b的值如下:" << endl;cout << b << endl;cout << "--------------------------" << endl;//(3)测试:+,并输出a+b的结果cout << "a+b的结果如下:" << endl;cout << a + b << endl;cout << "--------------------------" << endl;//(4)测试:=,将a赋给c,并输出ccout << "执行c=a之后,c的值如下:" << endl;c = a;cout << c;cout << "--------------------------" << endl;//(4)测试:整数左乘矩阵,计算a1*c并输出cout << "测试整数左乘矩阵" << endl;cout << "整数为:" << a1 << endl;cout << "矩阵为:" << endl << c;cout << "整数左乘矩阵结果如下:" << endl;cout << a1 * c;cout << "--------------------------" << endl;//(5)测试:整数右乘矩阵,计算c*a2并输出cout << "测试整数右乘矩阵" << endl;cout << "整数为:" << a2 << endl;cout << "矩阵为:" << endl << c;cout << "整数右乘矩阵结果如下:" << endl;cout << c * a2;cout << "--------------------------" << endl;//(6)测试:前置自增++,计算d=++c并输出cout << "测试前置自增++" << endl;cout << "c的初始值如下:" << endl;cout << c;cout << "d=++c执行之后结果如下:" << endl;d = ++c;cout << "c的结果如下:" << endl;cout << c;cout << "d的结果如下:" << endl;cout << d;cout << "--------------------------" << endl;//(7)测试:后置自增++,计算e=c++并输出cout << "测试后置自增++" << endl;cout << "c的初始值如下:" << endl;c = a;cout << c;cout << "e=c++执行之后结果如下:" << endl;e = c++;cout << "c的结果如下:" << endl;cout << c;cout << "e的结果如下:" << endl;cout << e;cout << "--------------------------" << endl;return 0;
}

结果示例

9bdffed78fb44e4895690cf5989d15e7.png5053a6146c324a2e9734fec094d70a8a.png

 

这篇关于双目运算符和单目运算符的重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888988

相关文章

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

Python海象运算符:=的具体实现

《Python海象运算符:=的具体实现》海象运算符又称​​赋值表达式,Python3.8后可用,其核心设计是在表达式内部完成变量赋值并返回该值,从而简化代码逻辑,下面就来详细的介绍一下如何使用,感兴趣... 目录简介​​条件判断优化循环控制简化​推导式高效计算​正则匹配与数据提取​性能对比简介海象运算符

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重