首页 > 编程语言 >运算符重载编程基础

运算符重载编程基础

时间:2024-06-06 23:59:43浏览次数:37  
标签:函数 ++ 编程 运算符 Complex 重载 c1

运算符重载编程基础


在这里插入图片描述

例如:
//全局函数 完成 +操作符 重载
Complex operator+(Complex &c1, Complex &c2)
//类成员函数 完成 -操作符 重载
Complex operator-(Complex &c2)

运算符重载的两种方法

在这里插入图片描述
在这里插入图片描述

例如1:
//通过类成员函数完成-操作符重载
//函数声明 Complex operator-(Complex &c2)
//函数调用分析
//用类成员函数实现-运算符重载
	Complex c4 = c1 - c2;
	c4.printCom();
	//c1.operator-(c2);

例如2:
//通过全局函数方法完成+操作符重载
Complex operator+(Complex &c1, Complex &c2) //函数声明 
//函数调用分析
int main()
{
		Complex c1(1, 2), c2(3, 4);
		//Complex c31 = operator+(c1, c2);
Complex c3 = c1 + c2; 
c3.printCom();
}

在这里插入图片描述

例如3
//前置++操作符 用全局函数实现 
Complex& operator++(Complex &c1) 
{
	c1.a ++;   
	c1.b ++;
	return c1;  
}
//调用方法
	++c1 ; //需要写出操作符重载函数原形
	c1.printCom();

//运算符重载函数名定义
	//首先承认操作符重载是一个函数 定义函数名operator++
	//分析函数参数 根据左右操作数的个数,operator++(Complex &c1)
	//分析函数返回值 Complex& operator++(Complex &c1) 返回它自身

例如4
//4.1前置—操作符 成员函数实现
Complex& operator--()
{
	this->a--;
	this->b--;
	return *this;
}

	//4.2调用方法
		--c1;
		c1.printCom();
	//4.3前置—运算符重载函数名定义
	//c1.operator--()

例如5 
	//5.1 //后置++ 操作符 用全局函数实现
Complex operator++(Complex &c1, int) 
{
	Complex tmp = c1;
	c1.a++;
	c1.b++;
	return tmp;
}
//5.2 调用方法
c1 ++ ; //先使用 后++
//5.3 后置++运算符重载函数名定义
 Complex operator++(Complex &c1, int) //函数占位参数 和 前置++ 相区别

例如6
//6.1 后置— 操作符 用类成员函数实现
	Complex operator--(int) 
	{
		Complex tmp = *this;
		this->a--;
		this->b--;
		return tmp;
	}
//6.2 调用方法
c1 ++ ; //先使用 后++
//6.3 后置--运算符重载函数名定义
 Complex operator--(int) //函数占位参数 和 前置-- 相区别

前置和后置运算符总结

C++中通过一个占位参数来区分前置运算和后置运算
在这里插入图片描述

定义运算符重载函数名的步骤

全局函数、类成员函数方法实现运算符重载步骤

  1. 要承认操作符重载是一个函数,写出函数名称operator+ ()
  2. 根据操作数,写出函数参数
  3. 根据业务,完善函数返回值(看函数是返回引用 还是指针 元素),及实现函数业务

友元函数实现操作符重载的应用场景

友元函数和成员函数选择方法

  1. 当无法修改左操作数的类时,使用全局函数进行重载
  2. =, [], ()和->操作符只能通过成员函数进行重载

用友元函数 重载 << >>操作符

  1. istream 和 ostream 是 C++ 的预定义流类
  2. cin 是 istream 的对象,cout 是 ostream 的对象
  3. 运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
  4. 运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
  5. 用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型
用全局函数方法实现 << 操作符 
ostream& operator<<(ostream &out, Complex &c1)
{
	//out<<"12345,生活真是苦"<<endl;
	out<<c1.a<<" + "<<c1.b<<"i "<<endl;
	return out;
}
//调用方法
cout<<c1;
//链式编程支持
cout<<c1<<"abcc";
//cout.operator<<(c1).operator<<("abcd");
//函数返回值充当左值 需要返回一个引用
b)类成员函数方法无法实现 << 操作符重载
//因拿到cout这个类的源码
//cout.operator<<(c1);

友元函数重载操作符使用注意点

友员函数重载运算符常用于运算符的左右操作数类型不同的情况
在这里插入图片描述
其他

  1. 在第一个参数需要隐式转换的情形下,使用友员函数重载运算符是正确的选择
  2. 友员函数没有 this 指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换
  3. C++中不能用友员函数重载的运算符有
    = () [] ->

友元函数案例vector类

#include <iostream>
using namespace std;

//为vector类重载流插入运算符和提取运算符 
class vector
{ 
public :
	vector( int size =1 ) ;       
	~vector() ;
	int & operator[]( int i ) ;
	friend ostream & operator << ( ostream & output , vector & ) ;
	friend istream & operator >> ( istream & input, vector & ) ;
private :  
	int * v ;     
	int len ;
};

vector::vector( int size ) 
{ 
	if (size <= 0 || size > 100 )
	{ 
		cout << "The size of " << size << " is null !\n" ; abort() ;  
	}
	v = new int[ size ] ;  len = size ;
}

vector :: ~vector() 
{ 
	delete[] v ;  
	len = 0 ; 
}

int &vector::operator[]( int i ) 		
{ 
	if( i >=0 && i < len )  return v[ i ] ;
	cout << "The subscript " << i << " is outside !\n" ;  abort() ;
}
ostream & operator << ( ostream & output, vector & ary )
{ 
	for(int i = 0 ; i < ary.len ; i ++ )  
		output << ary[ i ] << "  " ;
	output << endl ;
	return output ;
}
istream & operator >> ( istream & input, vector & ary )	
{ 
	for( int i = 0 ; i < ary.len ; i ++ )  
		input >> ary[ i ] ;
	return  input ;
}

void main()
{ 
	int k ;
	cout << "Input the length of vector A :\n" ;     
	cin >> k ;
	vector A( k ) ;
	cout << "Input the elements of vector A :\n" ;     
	cin >> A ;
	cout << "Output the elements of vector A :\n" ;
	cout << A ;
	system("pause");
}

标签:函数,++,编程,运算符,Complex,重载,c1
From: https://blog.csdn.net/2401_83614570/article/details/139503627

相关文章

  • JavaScript第十一讲:DOM编程“事件”
    前言当涉及到DOM(DocumentObjectModel)的事件时,JavaScript提供了许多内置的事件处理器,用于处理用户在网页上执行的各种操作。1.焦点事件当元素获得或失去焦点时触发。onfocus:当元素获得焦点时触发。onblur:当元素失去焦点时触发。//假设有一个输入框<inputtype="......
  • C++缺省参数函数重载
    缺省参数大家知道什么是备胎吗?C++中函数的参数也可以配备胎。3.1缺省参数概念缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。voidTestFunc(inta=0){cout<<a<<endl;}intmain(......
  • 嵌入式Linux系统编程 — 2.1 标准I/O库简介
    目录1标准I/O库简介1.1 标准I/O库简介1.2 标准I/O和文件I/O的区别2 FILE指针3标准I/O库的主要函数简介4 标准输入、标准输出和标准错误4.1标准输入、标准输出和标准错误概念4.2示例程序5 打开文件fopen()5.1 fopen()函数简介5.2 新建文件的权限5.3......
  • 函数重载和模板的区别与联系
    函数重载和模板的区别与联系函数重载(overloaded):定义函数名相同而形参列表(个数,类别)不同的多个函数,这些函数被称为重载函数,重载函数通常执行的操作非常类似,如打印不同的输入对象。调用函数时编译器根据实参的类型确定调用哪个重载函数。函数模板(template):实际上是建立一......
  • 面向互联世界的AGFA027R24C2I2V、AGFA027R24C3E4X、AGFA027R24C2E3V、AGFA027R24C3I3V
    Agilex™FPGA产品组合包含一系列产品,可充分满足每一个技术领域(从边缘到嵌入式系统,再到通信和数据中心)的众多可编辑逻辑需求。在所有这些领域中,数据爆炸导致新产品需求激增,以便移动、处理和存储数据并从中获得可执行的深度分析。这些产品的开发人员需要硬件灵活性来应对不断变化......
  • JAVAEE值网络编程(2)_TCP流套接字及通信模型、TCP网络编程及代码实例
    前言 在上一节内容中,我们介绍了什么是套接字,以及使用UDP数据报套接字网络编程,最后我们还介绍了Java数据报套接字通信模型以及相关代码实例。在这一节我们将会介绍TCP流套接字编程。一、流套接字及通信模型1.1TCP套接字 TCP,即TransmissionControlProtocol(传输控制......
  • C Primer Plus第六章学习笔记以及编程题
    1.dowhile循环while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环(exit-conditionloop),即在循环的每次迭代之后检查测试条件,这保证了至少执行循环体中的内容一次。这种循环被称为dowhil......
  • 八(汇编程序设计):输入5个同学成绩(有学号提示),然后排序,最后显示出名次表(学号,成绩)。要求:应
    代码DSEG SEGMENTGRADEDB5DUP(0)XUEHAODB'1','2','3','4','5'BUFDB4DUP(0)INFDB"Student",'$'NEWLINEDB0DH,0AHDSEGENDSSSEGSEGMENTSTACKSKTOPDB50DUP(0)S......
  • 七(汇编程序设计):已知一个M行N列的矩阵A,它的元素按行的顺序存于内存中,试编写求每行元素
    代码DSEGSEGMENTARRDB15H,22H,3H,0E4H,0A5H,56H,7H,18H DB31H,12H,13H,24H,45H,26H,47H,18H DB12H,25H,33H,34H,45H,66H,47H,81H DB10H,21H,63H,54H,56H,0C6H,0A7H,38HMDB4N DB8RowSumdw4DUP(0)ColSumdw8DUP(0)DSEGENDSCSEGS......
  • C++基础编程100题-004 OpenJudge-1.1-06 空格分隔输出
    更多资源请关注纽扣编程微信公众号http://noi.openjudge.cn/ch0101/06/描述读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。输入共有四行:第一行是一个字符;第二行是一个整数;......