运算符重载(一)---成员/非成员函数重载

运算符重载

1.运算符重载允许把标准运算符(如+、-、*、/、>等)应用于自定义数据类型的对象

2.直观自然,可以提高程序的可读性

3.体现了C++的可扩充性

4.运算符重载仅仅只是语法上的方便,它是函数调用的方式

5.运算符重载,本质上是函数重载

6.不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容易写、尤其是更易读时才有必要重载。

成员函数重载

1.成员函数原型的格式:
	函数原型 operator 运算符(参数表);

2.成员函数定义的格式:
	函数原型 类名::operator 运算符(参数表)
	{
		函数体;
	}

Complex.h

#pragma once

class Complex
{
public:
	Complex();
	Complex(int real, int imag);
	~Complex();

	Complex& Add(const Complex& other);

	Complex operator+(const Complex& other);

	void Display() const;
private:
	int real_;
	int imag_;
};

Complex.cpp

#include "Complex.h"
#include <iostream>

using namespace std;

Complex::Complex()
{

}

Complex::Complex(int real, int imag) : real_(real), imag_(imag)
{

}

Complex::~Complex()
{

}

Complex& Complex::Add(const Complex& other)
{
	real_ += other.real_;
	imag_ += other.imag_;

	return *this;
}
Complex Complex::operator+(const Complex& other)
{
	int r = real_ + other.real_;
	int i = imag_ + other.imag_;

	return Complex(r, i);
}

void Complex::Display() const
{
	cout << real_ << "+" << imag_ << "i" << endl;
}

main

#include <iostream>
#include "Complex.h"

using namespace std;

int main()
{
	Complex c1(3, 5);
	Complex c2(4, 6);

	c1.Add(c2);
	c1.Display();

	Complex c3 = c1 + c2;	//	等价于Complex c3 = c1.operator+(c2);
	
	c1.Display();
	c2.Display();
	c3.Display();

	return 0;
}

在这里插入图片描述

非成员函数重载

1.友元函数原型的格式:
	friend 函数原型 operator 运算符(参数表);

2.友元函数定义的格式:
	friend 函数原型 类名::operator 运算符(参数表)
	{
		函数体;
	}

Complex.h

#pragma once

class Complex
{
public:
	Complex();
	Complex(int real, int imag);
	~Complex();

	Complex& Add(const Complex& other);

	//Complex operator+(const Complex& other);

	friend Complex operator+(const Complex& c1, const Complex& c2);	//	xxxxxx
	
	void Display() const;
private:
	int real_;
	int imag_;
};


Complex.cpp

#include "Complex.h"
#include <iostream>

using namespace std;

Complex::Complex()
{

}

Complex::Complex(int real, int imag) : real_(real), imag_(imag)
{

}

Complex::~Complex()
{

}

Complex& Complex::Add(const Complex& other)
{
	real_ += other.real_;
	imag_ += other.imag_;

	return *this;
}
//Complex Complex::operator+(const Complex& other)
//{
//	int r = real_ + other.real_;
//	int i = imag_ + other.imag_;
//
//	return Complex(r, i);
//}

//	xxxxxx
Complex operator+(const Complex& c1, const Complex& c2)
{
	cout << "friend..." << endl;
	int r = c1.real_ + c2.real_;
	int i = c1.imag_ + c2.imag_;

	return Complex(r, i);
}

void Complex::Display() const
{
	cout << real_ << "+" << imag_ << "i" << endl;
}

在这里插入图片描述

运算符重载规则

1.运算符重载不允许发明新的运算符。

2.不能改变运算符操作对象的个数。

3.运算符被重载后,其优先级和结合性不会改变。

4.不能重载的运算符:
	作用域解析运算符	::
	条件运算符	?:
	直接成员访问运算符	.
	类成员指针引用运算符	.*
	sizeof运算符	sizeof
5.一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

6.以下一些双目运算符不能重载为类的友元函数:=、()、[]、->

7.类型转换运算符只能以成员函数方式重载

8.流运算符只能以友元的方式重载
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值