操作符重载

【C++】操作符重载 注意:操作符重载可以当做==“自定义类的运算”== 1 为什么需要操作符重载? 对于基础的变量,int等,不需要重载就知道如何做,但是对于自定义类,就无法进行运算,比如复数类。 2 操作符重载总结 1)操作符重载本质上是一个函数,可以采用 友元函数或者成员函数实现。但是采用这两种函数传递参数、实现代码、应用场合均不同。 全局函数与成员函数的比较: 全局函数中不传递this指针,成员函数默认传递this指针,因此成员函数可以少一个参数; 成员函数可以访问私有变量,全局函数需要转化为友元函数才可以。 2)操 阅读详情

操作符重载规则

  • 不能被重载的操作符
符号符号举例
.Peron.name
.*Person.*name=*(Person.name)
::作用域操作符
?:条件操作符
  • 操作符重载不能改变操作数的个数
  • 操作符重载不改变运算顺序(依然先算 * / 后算+ -)
  • 操作符重载不改变运算的结合性
  • 操作符重载不能有默认参数
  • 操作符重载至少要有一个自定义类型
  • 操作符重载应当与原来操作符含义相似
  • 操作符重载可以是类的成员函数、类的友元函数、还可以是普通函数


单目运算符

++(左)

  • 说明: ++(左)可以进行连+

class Point
{
//friend Point& operator++(Point& p);
public:
	
	Point(int x, int y)
	{
		m_x = x;
		m_y = y;
	}
	
	Point& operator++()
	{
		++m_x ;
		++m_y ;

	  return *this;
	}

	void Print()
	{
		cout << "(" << m_x << " " << m_y << ")" << endl;
	}
private:
	int m_x;
	int m_y;
};

//Point& operator++(Point& p)
//{
//	++p.m_x;
//	++p.m_y;

//	return p;
//}

int main(void)
{
	Point A(1, 0);
	Point B(2, 2);

	++++A; 
	
	A.Print();//(3 2)
	
    return 0;
}

++(右)

  • 说明:++(右)不能进行连+
#include "stdafx.h"
#include <iostream>
using namespace std;

class Point
{
//	friend const Point operator++(Point& p, int);
public:
	
	Point(int x, int y)
	{
		m_x = x;
		m_y = y;
	}
	
	const Point operator++(int) //因为不能连+的,所以加个const
	{
		Point tmp = *this;
		m_x++;
		m_y++;
		return tmp;
	}

	void Print()
	{
		cout << "(" << m_x << " " << m_y << ")" << endl;
	}
private:
	int m_x;
	int m_y;
};


//const Point operator++(Point& p, int) //返回的是临时变量,所以不能返回引用
//{
//	Point tmp = p;
//	p.m_x++;
//	p.m_y++;
//	return tmp;
//}


int main(void)
{
	Point A(1, 0);
	Point B(2, 2);


	A++;	
	A.Print(); //(2 1)
	
    return 0;
}



双目操作符重载

  • 重载写法两种:
operator+(L,R)   //全局
L.operator+(R)  //成员函数


+ 运算符

  • 举例:重载+操作符:将两个类相加(对应的成员变量相加)

写法1:全局函数,在类中申明为友元

#include "stdafx.h"
#include <iostream>
using namespace std;

class Point
{
//friend Point operator+(Point& p1, Point& p2);
public:	
	Point(int x, int y)
	{
		m_x = x;
		m_y = y;
	}	
	
	Point operator+(Point& p2) //定义为成员函数,禁止返回局部变量或者它的引用
	{
		Point tmp(this->m_x + p2.m_x, this->m_y + p2.m_y);
		return tmp;
	}
	
	void Print()
	{
		cout << "(" << m_x << " " << m_y << ")" << endl;
	}
private:
	int m_x;
	int m_y;
};

//Point operator+(Point& p1,Point& p2) //重载+操作符,在Point类里面申明为友元,禁止返回局部变量或者它的引用
//{
//	Point tmp(p1.m_x + p2.m_x, p1.m_y + p2.m_y);
//	return tmp;
//}


int main(void)
{
	Point A(1, 0);
	Point B(2, 2);

	Point C = A+B;  //全局显式: operator+(A,B)      //成员函数显式:A.operator+(B)
	C.Print();
	
	
    return 0;
}


+=运算符

#include "stdafx.h"
#include <iostream>
using namespace std;

class Point
{
	friend Point& operator+=(Point& p1, Point& p2); //申明全局为友元
public:
	
	Point(int x, int y)
	{
		m_x = x;
		m_y = y;
	}
	
	//Point& operator+=(Point& p2)  //或者申明成员函数
	//{
	//	m_x += p2.m_x;
//		m_y += p2.m_y;

//		return *this;
//	}
	void Print()
	{
		cout << "(" << m_x << " " << m_y << ")" << endl;
	}
private:
	int m_x;
	int m_y;
};


Point& operator+=(Point& p1, Point& p2)
{
	p1.m_x += p2.m_x;
	p1.m_y += p2.m_y;

	return p1;
}

int main(void)
{
	Point A(1, 0);
	Point B(2, 2);

	(A+=B)+=B; 
	A.Print();
	
    return 0;
}




<<  >> 运算符

  • 注意: >> 也不能写在成员函数内,只能写成全局函数
#include "stdafx.h"
#include <iostream>
#include "person.h"

using namespace std;


class Point
{
friend	ostream& operator<<(ostream& os, Point& p);
public:
	
	Point(int x, int y)
	{
		m_x = x;
		m_y = y;
	}

//	ostream& operator<<(ostream& os) <<操作符禁止写成员函数,否则调用变成: A << cout , 改变本意
//	{
	//	os << "(" << m_x << " " << m_y << ")";
	//	return os;
	//}
private:
	int m_x;
	int m_y;
};


ostream& operator<<(ostream& os, Point& p)
{
	os << "(" << p.m_x << " " << p.m_y << ")" ;
	return os;
}



int main(void)
{
	Point A(1, 0);
	Point B(2, 2);

	cout << A << B << endl; 
	
    return 0;
}



  • 注意: >> 也不能写在成员函数内
#include "stdafx.h"
#include <iostream>
using namespace std;

class Point
{
friend	istream& operator>>(istream& is, Point& p);
public:
	
	Point(int x, int y)
	{
		m_x = x;
		m_y = y;
	}

	void Print()
	{
		cout << "(" << m_x << "," << m_y << ")" << endl;
	}
private:
	int m_x;
	int m_y;
};



istream& operator>>(istream& is, Point& p)
{
	cout << "a:";
	is >> p.m_x;
	cout << "b:";
	is >> p.m_y;

	return is;
}


int main(void)
{
	Point A(1, 0);
	Point B(2, 2);

	 cin >> A >> B;
	
	 A.Print();
	 B.Print();
	 
    return 0;
}


= 运算符

#include "stdafx.h"
#include <iostream>
#include <string.h>

using namespace std;


class Student
{
public:
	Student()  //无参构造
	{
		m_id = 0;
		m_name = NULL;
	}

	Student(int id, const char name[]) //有参构造
	{
		m_id = id;
		int length = strlen(name);
		m_name = new char[length + 1];
		strcpy_s(m_name,length+1,name);
	}

	Student(const Student& another)  //拷贝构造
	{
		m_id = another.m_id;
		int length = strlen(another.m_name);
		m_name = new char[length + 1];
		strcpy_s(m_name, length + 1, another.m_name);
	}

	Student& operator=(const Student& another)  //=操作符重载,三件事
	{
		if(this==&another) return *this;//1. 防止自身赋值
		
		m_id = another.m_id;
		if (m_name != NULL)   //2. 判断是否为空,不为空,先释放
		{
			delete[]m_name;
			m_name = NULL;
		}

		int length = strlen(another.m_name); //3. 开辟内存
		m_name = new char[length + 1];
		strcpy_s(m_name, length + 1, another.m_name);

		return *this;
	}


	void Print()
	{
		cout << m_name << ": " << m_id << endl;
	}

	~Student()
	{
		if (m_name != NULL)
		{
			delete[] m_name;
			m_name = NULL;
		}
	}
private:
	int m_id;
	char* m_name;
};



int main(void)
{
	Student A (1, "julian");

	Student B (2, "mark");

	Student C (3, "kerr");

	C =A =B;
	C.Print(); //mark: 2


    return 0;
}



不建议重载 && 和 ||

  • 在已有的运算结构中 &&和 || 都有短路现象:if(a&&(a=1)) 如果a是0,那么后面(a=1)应该不执行,结果还是0,但是当你重载&&的时候: object.operator&&(t1), t1作为参数传进去,肯定是执行的,所以不会发生短路现象,但是有时候需要重载又不关心短路现象的时候可以进行重载


( ) 的重载

  • 重载()叫做仿函数,调用形式和函数类似
class Sqr
{
public:
	Sqr(int a)
	{
		this->a = a;
	}

	//想把s对象 定义成一个 带有一个参数的函数, 求出平方返回
	//此函数功能就是 对a求平方
	int operator()(int a)
	{
		return a*a;  //这个a和成员变量无关
	}
private:
	int a;
};


int main()
{
	Sqr A(3); //定义Sqr的对象A
	A(2); //求2的平方,返回4
}


-> 和 * 的重载

参考智能指针章节

Eureka自我保护机制 Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last 阅读详情

相关推荐

别再只放按钮了!巧用微信小程序‘长按识别’功能,打造无缝加群体验

本文深入探讨了微信小程序'长按识别'功能在社群运营中的创新应用,通过简化加群流程至一步操作,显著提升用户转化率。文章详细解析了技术实现细节、UI/UX设计策略,并对比了与企业微信API的适用场景,为开发者提供打造无缝加群体验的完整解决方案。

weixin_42627853的博客 417

C++学习系列(7)——详解操作符重载(运算符重载、赋值运算符重载、前置++和后置++重载深入解读)

深入解读C++操作符重载的知识,包括运算符重载,赋值运算符重载以及难以理解的前置++、后置++的重载,相信看完这篇文章你一定对操作符重载有个清晰的认识。

沈同学的博客 2848

FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测

当前,多模态假新闻的大量涌现导致了显著的分布差异,这一现状亟需我们开发具备广泛适用性的检测器。然而,现有假新闻检测器因特定领域内的训练方式,难以有效获取开放世界中的事实信息。这种训练的封闭性限制了传统检测器的能力,特别是在面对跨域假新闻时,其表现往往不尽如人意。具体而言,开放世界中的假新闻在两个方面具有显著的分布差异:一方面,其操纵内容多种多样,新闻的任一部分都可能受到创意策略的操控;另一方面,真实背景复杂多变,不同地区的新闻背景和主题焦点存在显著差异。

qq_52053775的博客 793

操作符重载!看这篇就够了!

实现一个操作符重载的方式通常有两种情况: 将操作符重载实现为类的成员函数。 操作符重载实现为非类的成员函数(即全局函数)。 将操作符重载实现为类的成员函数 在类体中声明(定义)需要重载操作符,声明方式跟普通的成员函数一样,只不过操作符重载函数的名字是“关键字operator +以及紧跟其后的一个C++预定义的操作符”。参数则需要传入除自己以外的别的参数(比如==需要两个参数,即自身和另...

NULL 2518

C++面向对象编程之六:重载操作符(<<,>>,+,+=,==,!=,=)

C++允许我们重新定义操作符(例如:+,-,*,/)等,使其对于我们自定义的类类型对象,也能像内置数据类型(例如:int,float,double)等一样直观,可以进行加,减,乘,除,比较大小等等操作。重载操作符本质是函数,只是这个函数的函数名比较特别,为:operator后接需要重新定义的操作符的符号。例如,重载+号,函数名为:operator+;重载-号,函数名:operator-。因为重载操作符本质是函数,所以实际上就是为某个自定义的数据类类型或枚举类型实现函数重载

天道酬勤 5731

c++重载操作符

c++支持重载操作符有算术操作符+、-、*、/、%关系操作符==、!逻辑操作符!、&&、||位操作符赋值操作符下标操作符[]函数调用操作符()成员访问操作符->指针操作符*(解引用)、&(取地址)逗号操作符这些操作符按照操作数个数不同分为单目操作符、双目操作符、多目操作符单目操作符!、~、->、*(解引用)、&(取地址)双目操作符其他多目操作符()为什么要按这个分类?别急,继续看...

米碎师兄 2417

C++操作符重载

简要介绍了各种操作符重载方式与实现

shadow_xwl的博客 5734

【C++重载操作符与转换】重载操作符的定义

在C++中,操作符重载(Operator Overloading)是一项强大的特性,它允许开发者为自定义类型(如类或结构体)重新定义内置操作符的行为。通过重载操作符,可以使自定义类型的对象表现得像内置类型一样自然,从而提升代码的可读性和可维护性。然而,操作符重载也是一把双刃剑,如果使用不当,可能会导致代码难以理解和调试。

byte轻骑兵的技术小窝 2053

C++操作符重载(不能被重载操作符

C++中的运算符: 名称 运算符 算数运算符 +、-、/、%、++、– 位操作运算符 &amp;amp;amp;、 逻辑运算符 !、&amp;amp;amp;&amp;amp;amp;、 比较运算符 &amp;amp;lt;、&amp;amp;gt;、&amp;amp;lt;=、&amp;amp;gt;=、==、!= 赋值运算符 =、+=、-=、*=、/=、%=、 其

ZWE7616175的博客 8338

重载操作符

重载操作符就是让操作符作用域非内置类型时也有自己独特的意义。 对于内置类型,当操作符作用于它们时,编译器会规定操作的意义:两个int型数据相加的结果与数学运算的加法相同。但是对于非内置类型,比如类或者枚举类型,编译器并没有规定操作符作用于它们的意义。有些时候,这样做是合理的,比如对于两个Student类对象(其中的数据成员有姓名、学号),对它们进行加法操作的确没有什么意义;但是有的时候,我们却希

thefutureisour的专栏 1万+

C++:重载操作符 & 赋值操作符重载需要注意的问题

一、操作符重载 1.什么是操作符重载 就是把一些操作符通过关键字operator,组装成一个函数,关键字operator后面接需要重载操作符符号 2.为什么需要重载操作符? (1)简单、方便,比起封装一个函数,使用operator比较形象直观 (2)可以提高代码的可读性 (3)为了处理自定义类型和内置类型之间的运算 3.操作符重载的格式 函数的返回类型 operator 操...

dangzhangjing97的博客 2423

操作符重载总结

一、重载的基本规则 1.重载操作符的形参数目应与操作符的操作数数目相同。 重载操作符作为类的成员函数,隐含一个*this作为函数的第一个函数 2.重载后,优先级、结合性、操作数目不变。但是不能保证求值顺序 求值顺序是指:在优先级、结合性相同的情况下,先求哪个 3.不能创建新的操作符 4.重载操作符必须至少有一个类类型或枚举类型 5.不可重载操作符:(

幸福在路上 1800

C++ 操作符重载

操作符介绍从微机原理中我们就知道了精简指令集计算机RISC,Reduced Instruction Set Computer中的指令分为操作符和操作数。其中操作按照参数个数分为:一元操作符和二元操作符。发展到C++等高级语言时,操作符又可以根据功能分为:算术、关系、位操作、逻辑运算、成员运算、函数调用、索引(下标)、递增、递减操作符。为了理解操作符重载,简单说一些重要的操作符。²        一

rendaduiyan的专栏 4113

c++操作符重载

容器对象list和vector使用时遇到find函数报错,那么问题的最终解决方案在操作符重载,这里就顺便将操作符重载的相关内容都详细介绍一遍,并给出实例代码

河西~石头 1675

C# 操作符重载对象详解

操作符重载是 C# 中一项强大的特性,它为自定义类型的操作提供了更多的灵活性和可读性。通过合理地重载操作符,我们可以让自定义类型像基本数据类型一样,方便地使用各种操作符进行运算和比较等操作。在使用操作符重载时,需要严格遵循相关的规则和注意事项,以确保代码的正确性和可维护性。随着对 C# 编程的深入学习,我们可以在更多的场景中应用操作符重载,提升代码的质量和开发效率。

zsnandzmn的博客 1335

5-操作符重载

操作符重载

创造价值 1459

java 操作符 重载_操作符重载

类中使用操作符,希望明了易懂,可以通过重载操作符,使自定义类使用操作符像一般类使用一样简洁。如何自定义操作符?其实操作符重载相当于函数的重载(代码中标注)。下面以“+”的重载为例子。#ifndef STUDENT_H#define STUDENT_H#include using namespace std;class student{public:student();student(int nu...

weixin_32017139的博客 878

C# 操作符重载

      操作符是C#中用于定义类的实例对象间表达式操作的一种成员。和索引器类似,操作符仍然是对方法实现的一种逻辑界面抽象,也就是说在编译成的IL中间语言代码中,操作符仍然是以方法的形式调用的。在类内定义操作符成员又叫操作符重载。C#中的重载操作符共有三种:一元操作符,二元操作符和转换操作符。并不是所有的操作符都可以重载,三种操作符都有相应的可重载操作符集,列于下表: 一元操作符

niehoude的专栏 1094

操作符重载问题

操作符重载问题 1.为什么要使用重载操作符呢? 因为普通操作符只能识别内置类型,而对于自定义的类它并不能识别,我们也可以通过重新写一个函数来实现这些操作符的功能,但是这样的做法太麻烦,且代码可读性低.而使用重载操作符,可以令程序更自然、更直观,而滥用操作符重载会使得类难以理解,在实践中很少发生明显的操作符重载滥用。但有些程序员会定义operator+来执行减法操作,当一个重载操作符不明确时,给

lemon 945

C++类—重载操作符

重载操作符是具有特殊名称的函数:保留字operator后接定义的操作符符号。如: [cpp] view plaincopy Sales_item operator+(const Sales_item &,const Sales_item &);   除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针

xietingcandice的专栏 2578
上一篇: 友元
下一篇: 智能指针
zzyczzyc
博客等级 码龄11年 69粉丝 262原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值