c++运算符重及其调用
本文参考自:https://blog.csdn.net/lisemi/article/details/93618161
运算符重载就是赋予运算符新功能,其本质是一个函数。
运算符重载时要遵循以下规则:
1.除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,其他运算符都可以重载。
2.重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符
3.运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。
4.重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
5.运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。
6.运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似。
7.一个运算符被重载后,原有意思没有失去,只是定义了相对一特定类的一个新运算符。
#include<iostream>
using namespace std; class Maritx{
public:
Maritx(){
cout<<"hello world"<<endl;
} Maritx(const int n[][],const int p[][],const int q[][]){
for(int i=;i<;++i){
for(int j=;j<;++j)this->a[i][j]=n[i][j];
}
for(int i=;i<;++i){
for(int j=;j<;++j)this->a1[i][j]=p[i][j];
}
for(int i=;i<;++i){
for(int j=;j<;++j)this->a2[i][j]=q[i][j];
}
} Maritx(Maritx & m,const int n[][],const int p[][],const int q[][]){
for(int i=;i<;++i){
for(int j=;j<;++j)m.a[i][j]=n[i][j];
}
for(int i=;i<;++i){
for(int j=;j<;++j)m.a1[i][j]=p[i][j];
}
for(int i=;i<;++i){
for(int j=;j<;++j) m.a2[i][j]=q[i][j];
}
} void print(){
for(int i=;i<;++i){
for(int j=;j<;++j)cout<<a[i][j]<<" ";
}
cout<<endl;
for(int i=;i<;++i){
for(int j=;j<;++j)cout<<a1[i][j]<<" ";
}
cout<<endl;
for(int i=;i<;++i){
for(int j=;j<;++j)cout<<a2[i][j]<<" ";
}
cout<<endl;
} Maritx & operator +(const Maritx & m){ // Maritx & operator + 可以实现类相加
Maritx arr;
for(int i=;i<;++i){
for(int j=;j<;++j) {
arr.a[i][j]=this->a[i][j]+this->a[i][j];
cout<<arr.a[i][j]<<" ";
}
}
cout<<endl;
} Maritx operator -(const Maritx &m){
Maritx arr;
for(int i=;i<;++i){
for(int j=;j<;++j) {
arr.a[i][j]=this->a1[i][j]-m.a1[i][j];
cout<<arr.a[i][j]<<" ";
}
}
cout<<endl;
} Maritx & operator *(const Maritx &m){
const int thisalength = sizeof(this->a)/sizeof(int); // 数组的大小
const int thisacolumns = sizeof(this->a[])/sizeof(int); // 数组列
const int thisarows = thisalength/thisacolumns; // 数组行
cout << "thisalength= "<<thisacolumns<<endl;
cout << "thisarows= "<<thisarows<<endl; const int a2length = sizeof(m.a2)/sizeof(int); // 数组的大小
const int a2columns = sizeof(m.a2[])/sizeof(int); // 数组列
const int a2rows = a2length/a2columns; // 数组行 cout << "a2columns= "<<a2columns<<endl;
cout << "a2rows= "<<a2rows<<endl; int newarr[a2rows][thisacolumns]={}; // 存放两个矩阵相乘后得到的结果(3×3)
int newarr1[thisarows][a2columns]={}; // 存放两个矩阵相乘后得到的结果(2×2) cout<<"this->a2*m.a结果为: "<<endl;
for(int i=;i<thisacolumns;i++){
for(int j=;j<a2rows;j++){
for(int k=;k<a2columns;k++){
newarr[i][j]+=this->a2[i][k]*m.a[k][j];
}
cout<<newarr[i][j]<<" ";
}
cout<<endl;
}
cout<<endl; cout<<"this->a*m.a2结果为: "<<endl;
for(int i=;i<a2columns;i++){
for(int j=;j<thisarows;j++){
for(int k=;k<thisacolumns;k++){
newarr1[i][j]+=this->a[i][k]*m.a2[k][j];
}
cout<<newarr1[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
} int operator[](const Maritx &m){ // 用成员方式重载运算符,不能改变参数的个数,二元运算符用成员重载时,只需要一个参数,另一个参数由this指针传入。如果需要两个参数,那么可以在类外面定义,然后在类里声明为友元。
cout<<m.a[][]<<endl;
} ~Maritx(){
cout<<"释放内存"<<endl;
}; int a[][];
int a1[][];
int a2[][];
}; int main(){
Maritx m;
int arr0[][]={{,,},{,,}};
int arr1[][]={{,,},{,,}};
int arr2[][]={{,},{,},{,}}; int arr00[][]={{,,},{,,}};
int arr11[][]={{,,},{,,}};
int arr22[][]={{,},{,},{,}};
Maritx(m,arr0,arr1,arr2); Maritx m1(arr00,arr11,arr22);
m.print();
m1.print();
Maritx m2=m-m1;
Maritx m3=m1-m;
Maritx m4=m*m1;
Maritx m5=m+m2;
return ;
}

c++运算符重及其调用的更多相关文章
- SetCurrentCellAddressCore 函数的可重入调用
绑定数据在线程中 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (Di ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++_运算符重载
什么是运算符的重载? 运算符与类结合,产生新的含义. 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义) 怎么实现运算符的重载? 方式:类的成员函数 或 友元函数(类外 ...
- [C++ Primer] : 第14章: 重载运算符与类型转换
基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...
- C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义
首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不 ...
- C++_运算符重载 总结
什么是运算符的重载? 运算符与类结合,产生新的含义. 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义) 怎么实现运算符的重载? 方式:类的成员函数 或 友元函数(类外 ...
- 12--C++_运算符重载
C++_运算符重载 什么是运算符的重载? 运算符与类结合,产生新的含义. 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义) 怎么实现运算符的重载? 方式:类的成员函数 ...
- 重学js之JavaScript 面向对象的程序设计(创建对象)
注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...
- 【C++】C++中重载运算符和类型转换
输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...
随机推荐
- Ef core 如何设置主键
在正题之前,先说明几个问题. (1)写 sql 不好吗,为什么要引入 ORM ? 总的来说由于需求的复杂性增加,引入了面向对象编程,进而有了 ORM ,ORM 使得开发人员以对象的方式表达业务逻辑.对 ...
- Chisel3 - bind - Op, ReadOnly, 左值
https://mp.weixin.qq.com/s/F_08jKFMoX9Gf_J_YpsDpg 两个数据变量进行某个操作(op),产生一个输出,这个输出存在一个匿名变量中.这个匿名变量就是以O ...
- Chisel3 - Tutorial - Functionality
https://mp.weixin.qq.com/s/3hDzpJiANdwp07hO03psyA 演示使用函数进行代码复用的方法. 参考链接: https://github.com/ucb- ...
- 【Hadoop】hdfs,剖析文件上传
文件上传原理图 剖析文件写入 1.客户端(client)通过对DistributedFileSystem对象调用create()来新建文件: FSDataOutputStream outputStre ...
- 题解 CF1348D 【Phoenix and Science】
题目大意,每天细菌会在早上选择分裂,晚上生长. 观察题目,我们可以发现.不管我们怎么分裂细菌,这一天晚上的总质量都是前一天晚上的总质量加上今天的细菌数. 那么我们肯定希望细菌分裂的越多越好,这样我们减 ...
- Java实现 LeetCode 507 完美数
507. 完美数 对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为"完美数". 给定一个 整数 n, 如果他是完美数,返回 True,否则返回 False ...
- Java实现 LeetCode 126 单词接龙 II
126. 单词接龙 II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: ...
- java实现第五届蓝桥杯生物芯片
生物芯片 X博士正在研究一种生物芯片,其逻辑密集度.容量都远远高于普通的半导体芯片. 博士在芯片中设计了 n 个微型光源,每个光源操作一次就会改变其状态,即:点亮转为关闭,或关闭转为点亮. 这些光源的 ...
- Java实现第九届蓝桥杯阶乘位数
阶乘位数 题目描述 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞&qu ...
- 天哪!手动编写mybatis雏形竟然这么简单
前言 mybaits 在ORM 框架中,可算是半壁江山了,由于它是轻量级,半自动加载,灵活性和易拓展性.深受广大公司的喜爱,所以我们程序开发也离不开mybatis .但是我们有对mabtis 源码进行 ...