(c++)运算符重载的规则

6.1运算符重载的规则

运算符重载:同一个运算符由于所操作的数据类型不同而具有不同的意义,就是运算符重载。
准确一点来说,运算符重载就是赋予已有的运算符多重含义

6.1.1运算符重载的规则

  • 重载运算符必须符合语言语法
  • 不能重载对内部c++数据类型进行操作的运算符(例如不能重载二元浮点减法运算符)
  • 不能创建新的运算符
  • 不能重载下面的运算符:
    . 类成员选择运算符
    .*成员指针运算符
    :: 作用域运算符
    ?:条件表达式运算符
    除此之外的运算符都可以被重载,并且只有“=”的重载函数不能被继承
  • 重载运算符要保持原有的基本语义不变

四个“不能改变”

  • 不能改变运算操作数的个数
  • 不能改变运算符原有的优先级
  • 不能改变运算符原有的结合性
  • 不能改变运算符原有的语法结构

6.1.2编译程序选择重载运算符的规则

因为运算符重载是一个函数,所以运算符的重载实际上是函数的重载。
编译程序对运算符重载的选择,是遵循函数重载的选择规则

运算符重载的形式

运算符函数必须被重载为非静态成员函数,或被重载为友元函数。【为了使运算符函数能够访问类中声明的私有成员】

6.2.1用成员函数重载运算符

原型<返回值类型>operator<运算符>(<形式参数表>)

  • <返回值类型>可以是任何有效类型,不过通常是返回操作类的对象
  • <运算符>表示要重载的运算符
  • <形式参数表>中的参数个数和重载的运算符操作数的个数有关

【由于每个非静态成员函数都带有一个隐含的自引用参数this指针,
对于一元运算符函数,不用显式声明形参,所需要的形参将由自引用参数提供,
对于二元运算符函数,只需显示声明右操作数,左操作数则由自引用参数提供】

举个例子:用成员函数重载运算符,实现复数的二元加减法

#include<iostream>
using namespace std;
class Complex
{
	public:
		Complex(double r=0.0,double i=0.0);
		Complex operator + (Complex c);//重载二元加
		Complex operator - (Complex c);//重载二元减
		void display();
	private:
		double real,imag; 
};
Complex::Complex(double r,double i)
{
	real=r;imag=i;
}
Complex Complex::operator +(Complex c)
{
	Complex temp;
	temp.real=real+c.real;
	temp.imag=imag+c.imag;
	return temp;
  }  
Complex Complex::operator -(Complex c)
{
	Complex temp;
	temp.real=real-c.real;
	temp.imag=imag-c.imag;
	return temp;
}
void Complex::display()
{
	char *str;
	str = (imag<0)?"":"+";
	cout<<real<<str<<imag<<"i"<<endl;
}
int main()
{
	Complex c1(12.4,13.3),c2(14.4,26.5);
	Complex c;
	cout<<"c1=";
	c1.display();
	cout<<"c2=";
	c2.display();
	c=c1+c2;
	cout<<"c1+c2=";
	c.display();
	c=c1-c2;
	cout<<"c1-c2=";
	c.display();
	return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值