《新标准C++程序设计》4.1(C++学习笔记12)
2024-09-02 13:47:06
运算符重载的概念和原理
一、运算符重载的需求
C++预定义的“+、-、 * 、/、%、 ^ 、&、~、!、|、 = 、<< >>、!= ”等运算符,只能用于基本数据类型(整型、实型、字符型、逻辑型)的常量或变量进行运算,不能用于对象之间的运算。
在数学上,两个复数可以直接进行+、-等运算。但在C++中,直接将+或-用于复数对象是不允许的。有时会希望,让对象也能通过运算符进行运算。这样代码更简洁,容易理解。
二、运算符重载
运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。
运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。
同一个运算符,对不同类型的操作数,所发生的行为不同。
三、运算符重载的形式
运算符重载的实质是函数重载
可以重载为普通函数,也可以重载为成员函数
把含运算符的表达式转换成对运算符函数的调用。
把运算符的操作数转换成运算符函数的参数。
运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。
运算符函数的格式:
返回值类型 operator 运算符(形参表)
{
……
}
程序示例分析:
#include<iostream>
using namespace std;
class Complex
{
public:
double real, imag;
Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) { }
Complex operator-(const Complex& c);
};
Complex operator+(const Complex& a, const Complex& b)
{
return Complex(a.real + b.real, a.imag + b.imag); //返回一个临时对象
}
Complex Complex::operator-(const Complex& c)
{
return Complex(real - c.real, imag - c.imag); //返回一个临时对象
}
int main()
{
Complex a(, ), b(, ), c;
c = a + b; //等价于c=operator+(a,b);
cout << c.real << "," << c.imag << endl;
cout << (a - b).real << "," << (a - b).imag << endl; //a-b等价于a.operator-(b)
return ;
}
输出结果:
,
,
Tips:
重载为成员函数时,参数个数为运算符目数减一。
重载为普通函数时,参数个数为运算符目数。
“类名(构造函数实参表)”这种写法表示生成一个临时对象。
最新文章
- android获取手机信息2
- Linux Kernel Schduler History And Centos7.2&#39;s Kernel Resource Analysis
- POJ1401 - Factorial
- html5之拖放简单效果
- React Native底|顶部导航使用小技巧
- C++学习-8
- python-数据类型之题型
- vue富文本编辑器
- JDBC测试计划-连接mysql
- MVC的SignalR例子
- 排错-lr回放错误Vuser&#160;failed&#160;to&#160;initialize&#160;extensi...解决方法
- MySQL(九)插入、更新和删除
- Centos7防火墙开放8080端口
- 在mac下配置Andriod环境 包括eclipse和andriod studio
- php 去除数组中指定的值
- python基础之字符串格式化
- C#调用C++ memcpy实现各种参数类型的内存拷贝 VS marshal.copy的实现 效率对比
- 如何使用vsphere client 克隆虚拟机
- 【hash】【P5079】P5079 Tweetuzki 爱伊图
- 轻量ORM-SqlRepoEx (十)SqlRepoEx Nuget包下载说明
热门文章
- 为什么maven没有.m2文件
- 解决Office安装错误代码1024:安装程序无法打开注册表项UNKNOWN\Components\
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:表单帮助文本
- AngularJS 官方启动文档
- java并发初探ConcurrentHashMap
- CNN反向传播算法公式
- 第1节 storm编程:4、storm环境安装以及storm编程模型介绍
- English-Names
- boost::timer demo
- POJ 2718 Smallest Difference dfs枚举两个数差最小