1运算符重载的规则
C++ 几乎可以重载全部的运算符,而且只能够重载C++中已经有的。
不能重载的运算符:“.”、“.*”、“::”、“?:”
重载之后运算符的优先级和结合性都不会改变。

重载的两种形式:
  1 重载为类的非静态成员函数;
  2 重载为非成员函数。


2双目运算符重载为成员函数

函数类型 operator 运算符(形参)
{
......
}
参数个数=原操作数个数-1 (后置++、--除外)

双目运算符重载规则:
  如果要重载 B 为类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的成员函数,
  形参类型应该是 oprd2 所属的类型。
  经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)

//例8-1复数类加减法运算重载为成员函数
#include<iostream>
using namespace std;
class Complex{
public:Complex(double r = 0.0, double i = 0.0):real(r), image(i){}Complex operator +(const Complex &c2) const;Complex operator -(const Complex &c2) const;void display() const;
private:double real;double image;
};
Complex Complex::operator+(const Complex &c2) const{return Complex(real+c2.real, image+c2.image);//创建一个临时无名对象作为返回值
}
Complex Complex::operator-(const Complex &c2) const{return Complex(real-c2.real, image-c2.image);
}
void Complex::display() const{cout << "(" << real << ", " << image << ")" << endl;
}
int main(){Complex c1(5,4),c2(2,10),c3;cout << "c1 = "; c1.display();cout << "c2 = "; c2.display();c3 = c1 - c2;cout << "c3 = c1 - c2 = "; c3.display();c3 = c1 + c2;cout << "c3 = c1 + c2 = "; c3.display();return 0;
}


3单目运算符重载为成员函数
前置单目运算符重载规则:
  如果要重载 U 为类成员函数,使之能够实现表达式 U oprd,其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数,无形参。
  经重载后,表达式 U oprd 相当于 oprd.operator U()
后置单目运算符 ++和--重载规则:
  如果要重载 ++或--为类成员函数,使之能够实现表达式 oprd++ 或 oprd-- ,其中 oprd 为A类对象,则 ++或-- 应被重载为 A 类的成员函数,且具有一个 int 类型形参。
  经重载后,表达式 oprd++ 相当于 oprd.operator ++(0)

//例8-2重载前置++和后置++为时钟类成员函数
#include<iostream>
using namespace std;
class Clock{
public:Clock(int hour = 0, int minute = 0, int second = 0);void showTime() const;Clock& operator ++();//前置单目运算符重载Clock operator ++ (int);//用参数表来区分两个重载函数,函数体中不适用
private:int hour, minute, second;
};
Clock::Clock(int hour, int minute, int second){if(0 <= hour && hour < 24 && 0 <= minute && minute < 60 && 0 <= second && second <60){this->hour = hour;this->minute = minute;this->second = second;}else{cout << "Time error!" << endl;}
}
void Clock::showTime() const{cout << hour << " : " << minute << " : " << second << endl;
}
Clock &Clock::operator ++ (){//返回本类对象的引用second++;if(second >= 60){second-=60;minute++;if(minute >= 60){minute-=60;hour = (hour+1)%24;}}return *this;
}
Clock Clock::operator ++(int){Clock old = *this;++(*this);//调用前置++运算符(形参)return old;
}
int main(){Clock myClock(23,59,59);cout << "First time output: ";myClock.showTime();cout << "Show myClock++: ";(myClock++).showTime();cout << "Show ++myClock: ";(++myClock).showTime();return 0;
}


4运算符重载为非成员函数
运算符重载为非成员函数的规则:
  函数的形参代表依自左至右次序排列的各操作数。
  参数个数=原操作数个数(后置++、--除外)
  至少应该有一个自定义类型的参数。
  如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为该类的友元。

双目运算符 B重载后,
  表达式oprd1 B oprd2
  等同于operator B(oprd1,oprd2)
前置单目运算符 B重载后,
  表达式 B oprd
  等同于operator B(oprd )
后置单目运算符 ++和--重载后,
  表达式 oprd B
  等同于operator B(oprd,0)

//例8-3 重载Complex的加减法和“<<”运算符为非成员函数
#include<iostream>
using namespace std;
class Complex{
public:Complex(double r = 0.0, double i = 0.0):real(r), image(i){}friend Complex operator+(const Complex &c1, const Complex &c2);friend Complex operator-(const Complex &c1, const Complex &c2);//它的左操作数是std::ostream引用,右操作数为复数类的常引用,返回std::ostream引用friend ostream &operator<<(ostream &out, const Complex &c);
private:double real;double image;
};Complex operator+(const Complex &c1, const Complex &c2){return Complex(c1.real+c2.real, c1.image+c2.image);
}
Complex operator-(const Complex &c1, const Complex &c2){return Complex(c1.real-c2.real, c1.image-c2.image);
}
ostream &operator<<(ostream &out, const Complex &c){out << "(" << c.real << ", " << c.image << ")";return out;
}
int main(){Complex c1(5,4),c2(2,10),c3;cout << "c1 = " << c1 << endl;cout << "c2 = " << c2 << endl;c3 = c1 - c2;cout << "c3 = c1 - c2 = " << c3 << endl;c3 = c1 + c2;cout << "c3 = c1 + c2 = " << c3 << endl;return 0;
}

转载于:https://www.cnblogs.com/leosirius/p/8075666.html

Part8 多态性 8.1运算符重载相关推荐

  1. c++重载(以运算符重载为主)

    重载(OverLoading)是面向对象程序设计多态性的一种体现.所谓重载,是指"同一标识符"在同一作用域的不同场合具有不同的语义,这个标识符可以是函数名或运算符.也就是说,重载可 ...

  2. 运算符重载为类的成员函数

    运算符重载 运算符重载为类的成员函数后就可以像其他成员函数一样访问本类的数据成员了. 在类的外部通过类的对象,可以像原运算符的使用方式那样使用重载的运算符,比如,"+"运算符被重载 ...

  3. C#编程(四十)----------运算符重载

    运算符重载 所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力. 例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和. int i=5,j=4; int ...

  4. 音视频开发(十九):运算符重载、继承、多态、模版

    目录 类和对象的重要知识点 运算符重载 继承 多态 模版 一.类和对象的重要知识点 1.1 深拷贝与浅拷贝 浅拷贝:简单的赋值拷贝操作,拷贝构造 深拷贝:在堆区重新申请空间,进行拷贝操作 1.2 th ...

  5. 音视频开发系列(46)运算符重载、继承、多态、模版

    一.类和对象的重要知识点 1.1 深拷贝与浅拷贝 浅拷贝:简单的赋值拷贝操作,拷贝构造 深拷贝:在堆区重新申请空间,进行拷贝操作 1.2 this指针 this指针指向被调用的成员函数所属的对象. 本 ...

  6. groovy–运算符重载

    Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象. 下面的表格描述了groovy中的操作符所映 ...

  7. c++运算符重载总结

    c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁.高效.在c++中不止函数可以重载,运算符也可以重载.由于一般数据类型间的运算符没有重载的必要, ...

  8. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  9. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

最新文章

  1. php 二维数组排序函数,php自定义二维数组排序函数array
  2. 一些链接, 关于不可变数据
  3. 多视角图像生成--Multi-View Image Generation from a Single-View
  4. 模仿SDWebImage实现异步加载图片
  5. gan 总结 数据增强_[NLP]聊一聊,预处理和数据增强技术
  6. mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高(问题原因还待考证)...
  7. LTE各场景下的密钥处理
  8. 建造者模式 coding
  9. @RequestMapping和@GetMapping @PostMapping 区别
  10. 若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?
  11. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例
  12. FPGA状态机跑飞原因分析
  13. 【特征提取】基于matlab熵函数语音端点检测【含Matlab源码 1764期】
  14. CSDN的markdown编辑器详细使用说明、语法快速索引手册
  15. 解析DXF图形文件格式
  16. python中模块和包是什么_python的模块和包的详细说明
  17. 微信8年,这几个冷知识你都知道吗?想必知道的人也不多吧
  18. BitmapFactory压缩图片
  19. 2D变形效果有几种?变形效果讲解
  20. Python玩转数据分析——双因素方差分析

热门文章

  1. 词嵌入应用_神经词嵌入的法律应用
  2. XManager:xshell显示图形化界面
  3. 欢迎使用CSDN-markdown编辑器啦啦啦啦啦
  4. 征信上显示保险代偿记录,那你的信用基本就黑了
  5. 做一个幸福的“生活家”:谈《心欢喜,灵快乐》
  6. [转] 常见WinCE启动失败原因分析
  7. 通过服务器给多台计算机装系统,怎么快速给机房多台电脑安装系统?
  8. lepus监控oracle数据库_lepus天兔数据库监控系统搭建记录
  9. php导出excel出现乱码,php导出数据到excel出现乱码的解决办法
  10. Ubuntu中python调用SimpleITK来显示图像