C++中类的运算符重载教程(一),内附完整代码与解析

5 篇文章 0 订阅
2 篇文章 0 订阅

目录:

一:加号运算符重载

对+重载函数的理解:(个人理解,仅供参考)

二:左移运算符的重载

对<<重载函数的理解(个人理解,仅供参考)

三:自增运算符重载

一:加号运算符重载

在对类进行操作时,如果我们想直接对类的两个实例化对象进行相加(数学计算,加减乘除之类的),那么编译器会报错,告诉我们没有与这些操作数匹配的类型。那么这里就可以用到我们的运算符重载函数了。

 基本格式:

返回类型 operator 需要重载运算符(函数参数)//  例如这里我们对+运算符进行重载。

这里我使用的是全局函数实现的+运算符重载,为了可以访问person类的私有属性,需要将该函数声明为person类的友元函数,当然也可以通过成员函数实现。

  如果对友元函数有什么不清楚的可以点击下方链接了解简单易懂的C++类的友元教程(friend)。全局函数做类友元,一个类做另一个类的友元,一个类中某个成员函数做友元。过程中顺序很重要哦。最后附有完整实现代码_来年秋风起^的博客-CSDN博客https://blog.csdn.net/qq_51004011/article/details/125413810?spm=1001.2014.3001.5501

函数体的实现:

//全局函数实现+运算符重载
person operator+(person& p1, person& p2)
{
	person tmp;
	tmp.data = p1.data + p2.data;
	return tmp;
}

//成员函数做+运算符重载
person person::operator+(person& p1)
{
	person tmp;
	tmp.data = this->data + p1.data;
}

在+运算符重载函数被定义好后,就已经可以直接实现此类的两个对象进行相加的操作了。

当然还有减号,乘除这些都可以这样进行重载。这里就不一一举例了。

对+重载函数的理解:(个人理解,仅供参考)

我们在实现完成类的两对象+重载函数后,再直接进行两个对象相加时,+运算符会自动匹配operator+函数,然后p1与p2分别与该函数的第一个,第二个参数类型相匹配,最后成功调用该函数。

 

二:左移运算符的重载

同样,如果我们想直接cout(输出)该类中的数据也不行

 也是因为没有与这些操作数匹配的<<(左移)运算符,这里对<<重载一下就行了。

函数实现:(注意这个重载函数最好写成全局函数的形式!!!

//全局函数实现左移运算符重载。<<
ostream& operator<<(ostream& cout, person& p)
{
	cout << p.data;
	return cout;
}

函数返回类型详解:

 这里的返回类型一定要是ostream&类型的,cout一些数据时,会默认在最后拼接一个endl(换行),所以这里需要将原来的cout返回,才能在最后拼接endl。

这里对>>(右移运算符重载也是可以的,只需要将返回类型与第一个参数类型该为istream即可)

对<<重载函数的理解(个人理解,仅供参考)

我们在实现完成类的<<重载函数后,再直接对这个类的对象进行输出,<<运算符会自动匹配operator<<函数,然后cout与p1分别与该函数的第一个,第二个参数类型相匹配,最后成功调用该函数。

 调用完该函数后,函数返回了一个cout的引用,所以在后面可以拼接endl或者其他数据类型。

三:自增运算符重载

同样的,我们直接对对象进行++,或者--也不能实现(没有与这些操作数匹配的++运算符

 所以我们也需要++,进行重载即可,这个函数可以定义为全局函数,或者成员函数都可以。

(1)前置++重载实现

前置++,先对变量进行++,然后使用该变量本身。所以这里的返回类型为person&,该对象本身。函数声明为:person& person::operator++();

//++,前置++运算符重载
person& person::operator++()
{
	this->data++;
	return *this;
}

 可以看到,结果确实如我们预期,可以直接对person类的对象进行++操作。

(2)后置++重载实现

后置++,先使用变量中的数据,然后对变量中数据进行++操作。

所以我们创建一个临时变量来存储原来的值然后对变量中数据进行++操作,这里的返回类型为person,创建出的临时变量函数声明为:person person::operator++(int);加了一个int作为占位参数来区分。

//++后置重载,int占位参数与前置++重载函数区分
person person::operator++(int)
{
	person tmp(*this);
	this->data++;
	return tmp;
}

对于自减运算符的重载也和上面的实现方式类似,只需要将++该成--即可,这里我就不去实现了。

最后附上总的实现代码:

#pragma once
#include<iostream>
#include<string>
using namespace std;
class person;

//全局函数实现+运算符重载
person operator+(person &p1,person &p2);

//全局函数实现左移运算符重载。<<
ostream& operator<<(ostream& cout, person& p);

class person
{
	friend ostream& operator<<(ostream& cout, person& p);
	friend person operator+(person& p1, person& p2);
public:
	person();
	person(int a);
	person(const person& p);
	//person operator+(person& p1);
	//成员函数实现前置,后置++重载
	person& operator++();//前置++重载
	person operator++(int);//后置++重载

private:
	int data;
};


person::person()
{
	;
}
person::person(int a)
{
	this->data = a;
}
person::person(const person& p)
{
	this->data = p.data;
}

//全局函数实现+运算符重载
person operator+(person& p1, person& p2)
{
	person tmp;
	tmp.data = p1.data + p2.data;
	return tmp;
}

//成员函数做+运算符重载
//person person::operator+(person& p1)
//{
//	person tmp;
//	tmp.data = this->data + p1.data;
//}

//全局函数实现左移运算符重载。<<
ostream& operator<<(ostream& cout, person& p)
{
	cout << p.data;
	return cout;
}

//++,前置++运算符重载
person& person::operator++()
{
	this->data++;
	return *this;
}

//++后置重载,int占位参数与前置++重载函数区分
person person::operator++(int)
{
	person tmp(*this);
	this->data++;
	return tmp;
}

void test1()
{
	person p1(1);
	cout << p1 << endl;
	//++p1;
	p1++;
	cout << p1 << endl;
}

int main()
{
	test1();
	return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值