首页 > 其他分享 >运算符重载,两种常见运算符重载(加号运算符重载,左移运算符重载)

运算符重载,两种常见运算符重载(加号运算符重载,左移运算符重载)

时间:2024-08-26 15:24:51浏览次数:6  
标签:p2 p1 temp 左移 运算符 Person 重载

一、为什么要进行运算符重载?

在我们编写程序时,我们需要用到自定义数据类型,但是我们普通的运算符只能正常操作系统内置的数据类型比如我们常用的int,double无法自动识别我们的自定义数据类型。例如你设置了一个Person类,他有年龄,身高,体重等属性,那你做两个Person对象相加时系统应该怎样运算呢?显而易见系统是不知道的,所以就要我们重载运算符,告诉编译器应该怎么进行运算,下面我将给大家分享几种常用的运算符重载。
运算符重载一般有类内实现和类外实现两种方法。

二、运算符重载的实现

实现运算符重载其实就是写一个函数,只不过这个函数的函数名是关键字operator后面跟上你要重载的运算符号,然后返回值类型是我们实际情况需要的返回值类型,比如我们重载要计算的是int类型,那么两个int类型相加肯定还是int类型返回值就写int类型,如果是Person类型那么两个Person类型相加返回值肯定是Person类型,然后再函数体中实现如何运算。

三、常见的两种运算符重载

3.1、加号运算符重载 “+”

我们先创建一个Person类,他有m_A属性和m_B属性两个属性,假设Person对象相加就是两个对象的m_A相加赋给新的m_A,两个对象的m_B相加赋给新的m_B。
首先我们类内实现加号运算符重载,类内实现时我们本身是一个对象,所以参数只需要传递一个Person对象,我们用引用的方法将他传递进来,最后实现相加。

class Person
{
public:
	int m_A;
	int m_B;
//类内实现加号运算符重载
	Person operator+(Person& p)
    {
	  Person temp;
	  temp.m_A = this->m_A + p.m_A;
	  temp.m_B = this->m_B + p.m_B;
	  return temp;
    }
};

首先我们创建两个Person对象并给他的m_A和m_B赋值,然后我们计算p1+p2并把结果赋值给p3,最后输出p3。当我们没有写运算符重载函数时Person p3=p1+p2这行代码时会报错的,但是加了之后我们就能正常运行了,

void test01()
{

	Person p1;
	p1.m_A = 10;
	p1.m_B = 20;

	Person p2;
	p2.m_A = 10;
	p2.m_B = 21;

	Person p3 = p1 + p2;
	cout << "p3.m_A=  " << p3.m_A << "   p3.m_B=  " << p3.m_B << endl;

	
}

全部代码如下

#include<iostream>
using namespace std;

class Person
{
public:
	int m_A;
	int m_B;

	/*Person operator+(Person& p)
	{
		Person temp;
		temp.m_A = this->m_A + p.m_A;
		temp.m_B = this->m_B + p.m_B;
		return temp;
	}*/
};

Person operator+(Person& p1, Person& p2)
{
	Person temp;
	temp.m_A = p1.m_A + p2.m_A;
	temp.m_B = p1.m_B + p2.m_B;
	return temp;
}

void test01()
{

	Person p1;
	p1.m_A = 10;
	p1.m_B = 20;

	Person p2;
	p2.m_A = 10;
	p2.m_B = 21;

	Person p3 = p1 + p2;
	cout << "p3.m_A=  " << p3.m_A << "   p3.m_B=  " << p3.m_B << endl;
}
int main()
{
	test01();

	system("pause");
	return 0;
}

运行结果如下
在这里插入图片描述
类外实现
运算符重载类外实现的话我们只需要在重载函数参数列表上添加两个参数即可实现如下:

Person operator+(Person& p1, Person& p2)
{
	Person temp;
	temp.m_A = p1.m_A + p2.m_A;
	temp.m_B = p1.m_B + p2.m_B;
	return temp;
}

3.2、左移运算符重载 “<<”

注意:左移运算符的重载不用类内函数重载,一般用全局函数重载。
我们还是创建Person类并以他为例举例。
如果对象的属性是私有成员,我们可以通过做友元的方法来实现左移运算符的重载,如果是公有成员我们就可直接重载,这里我们将属性设置为私有成员,方便我们练习友元,(如不知道什么是友元可翻看我往期文章有详细解答)
下面是重载代码,翻看"<<“运算符定义我们发现他的数据类型是输出流数据类型,所以我们返回值类型是ostream,我们在重载”<<“时还要重载一个输出流对象ostream out和一个要输出的对象Person p,我们都用引用的方式给他传进来,注意我们的返回值类型也用到了引用类型,这就要提到一个链式编程思维了,这里我们就先记住重载”<<"时返回值类型要用到引用就行。

class person
{
	//"<<"重载全局函数做友元
	friend ostream& operator<<(ostream& out, person& p);
public:
	person(int a, int b)
	{
		m_a = a;
		m_b = b;
	}
private:
	int m_a;
	int m_b;

	
	//左移运算符的重载不用类内函数重载,一般用全局函数重载
};


//"<<"重载函数
ostream& operator<<(ostream &out,person &p)
{
	out << "m_a= " << p.m_a << "  m_b=" << p.m_b << endl;
	return out;
}

全部代码如下

#include<iostream>
using namespace std;

class person
{
	//"<<"重载全局函数做友元
	friend ostream& operator<<(ostream& out, person& p);
public:
	person(int a, int b)
	{
		m_a = a;
		m_b = b;
	}
private:
	int m_a;
	int m_b;

	
	//左移运算符的重载不用类内函数重载,一般用全局函数重载
};


//"<<"重载函数
ostream& operator<<(ostream &out,person &p)
{
	out << "m_a= " << p.m_a << "  m_b=" << p.m_b << endl;
	return out;
}

void test01()
{
	person p(10, 10);
	cout << p << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

下面是运行结果
在这里插入图片描述

标签:p2,p1,temp,左移,运算符,Person,重载
From: https://blog.csdn.net/m0_57094953/article/details/141524902

相关文章

  • 运算符
    运算符运算符类型符号算数运算符+,-,*,/,%,++,--赋值运算符=关系运算符>,<,>=,<=,==,!=,instanceof逻辑运算符&&,||,!注意在int类型/int类型时及时强制转换类型小技巧ctr+D复制当前行到下一行幂运算很多运算我们会使用工具类 doublepow=Math.pow......
  • Shell脚本学习_运算符
    目录一、算数运算符1、expr命令:2、算数运算符介绍:3、使用(()) 进行运算: 4、bc命令:1.bc中互动式的数学运算:2.非互动式的管道运算:3.非互动式的输入重定向运算:二、比较运算符 1、整数比较运算符:2、字符串比较运算符:3、[[]] 和 []的区别:三、布尔运算......
  • 方法的重载
    1.定义重载是指多个方法在同一个类中,方法名相同,但形参即类型不同的函数2.重载的作用可以让电脑有更多的返回选择,如:既可以返回小数也可以返回整数3.重载的规则4.实操......
  • C++ //练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。
    C++Primer(第5版)练习19.23练习19.23为你的Token类添加移动构造函数和移动赋值运算符。环境:LinuxUbuntu(云服务器)工具:vim 代码块classToken{ public: Token():tok(INT),ival(0){} Token(constToken&t):tok(t.tok){copyUnion(t);} Token&operator=(......
  • 运算符 类定义 Math类的使用 数组的使用
    1.基本的算术运算符5个:+ - * / %都是双目运算符(两个操作数),其中%要求的两个操作数必须为整数。2.自增、自减运算符++ --注意作为前缀和后缀的用法不同.3.表达式计算中的数据类型转换(1)自动类型转换:当参与运算的两个操作数类型不同时,先把低类型的数据转换为高类......
  • Python 教程(三):Python运算符合集
    Python中常用的一些运算符类型算术运算符+:加法-:减法*:乘法/:除法(结果为浮点数)%:取模(即除法余数)**:幂(指数)//:整除(结果为商的整数部分)示例代码: a=10b=3print("加法:",a+b)#输出13print("减法:",a-b)#输出7print("乘法:",a*b)#输出3......
  • C++ 使用 using 声明语句放开基类的重载函数
    #include<functional>#include<string>#include<iostream>#include<vector>#include<memory>#include<set>#include<map>usingnamespacestd;namespace{classAnimal{public:stringGe......
  • 运算符
    1:运算对常量和变量进行操作的过程称为运算。2:运算符对常量和变量进行操作的符号称为运算符3:操作数参与运算的数据称为操作数4:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的式子体现的是不同类型的表达式。注意事项:一个表达式最终......
  • FPGA开发——verilog的运算符以及相关优先级的介绍
    一、简介        在我们学习任何一门编程语言时,不可避免的都会遇见运算符和相关的运算优先级的问题,只有掌握了各个运算符的优先级关系我们才能进行更好的代码编写。在前面的时候因为我没有遇到因为优先级而导致的工程结果错误,所以没有过多注意,但是遇到之后才发现运算......
  • 位运算符-按位取反运算符补充详解
    位运算符在计算机中用于直接操作整数的二进制位的运算符。这些运算符通常用于低级编程和优化特定类型的计算任务。以下是几种常见的位运算符及其解释:按位与(&):对应位都是1时结果为1,否则为0。例如:0101&0111=0101按位或(|):只要对应位有一个是1,结果就为1。例如:0101|0111=......