C++进阶学习(2)运算符重载2.0

文章目录

    • 三、几个典型运算符重载
      • 1.++与--
        • ①成员函数
        • ②友元函数
      • 2.重载赋值运算符
        • ①条件
        • ②代码
      • 3.重载运算符[]和()
        • ①前提
        • ②重载下标运算符 []
        • ③重载函数调用符 ()
        • ④重载流插入和流提取运算符
          • a.前提

三、几个典型运算符重载

1.++与–

①成员函数
#include<iostream>
using namespace std;
class  Increase
{ public :Increase ( ) { value=0; }void  display( )  const { cout<<value<<'\n'; } ;Increase  operator ++ ( ) ; 	     // 前置Increase  operator ++ ( int ) ;    // 后置**(返回的是拷贝值而不是本身)private:   unsigned  value ;
};
Increase  Increase :: operator ++ ( ) //前置	{ value ++ ;   return *this ; }	
Increase  Increase :: operator ++ ( int )//后置	{ Increase  temp;   temp.value = value ++ ;   return  temp; }
int main( ){ Increase   a ,  b , n ;    int  i ;for ( i = 0 ; i < 10 ; i ++ )  a = n ++ ;cout <<"n= " ;  n.display( ) ;   cout <<"a= " ;   a.display( ) ;for ( i = 0 ; i < 10 ; i ++ )  b = ++ n ;cout << "n= " ;   n.display( ) ;   cout << "b= " ;   b.display( ) ;}
②友元函数
#include<iosstream>
using namespace std;
class Increase
{public:Increase () {value=0;}void display() const {cout<<value<<'\n'};friend Increase operator ++();//前置friend Increase operator ++(Increase &,int);//后置private: unsigned value;
};
Increase Increase:: operator ++(Increase &)
{I.value++; return I;}
Increase Increase:: operator ++(Increase &I,int)
{Increase  temp(a);   I.value ++ ;   return  temp;}
int main( ){ Increase   a ,  b , n ;    int  i ;for ( i = 0 ; i < 10 ; i ++ )  a = n ++ ;cout <<"n= " ;  n.display( ) ;   cout <<"a= " ;   a.display( ) ;for ( i = 0 ; i < 10 ; i ++ )  b = ++ n ;cout << "n= " ;   n.display( ) ;   cout << "b= " ;   b.display( ) ;}

2.重载赋值运算符

①条件
  • 赋值运算符重载用于对象数据的复制
  • operator= 必须重载为成员函数
  • 重载函数原型为:类名 & 类名 :: operator= ( 类名 ) ;
②代码
#include<iostream>
#include<cstring>
using namespace std;
class  Name
{ public :Name ( char  *pN ) ;Name( const Name & ) ;		    //复制构造函数 Name& operator=( const Name& ) ;	    // 重载赋值运算符~ Name() ;protected : char  *pName ;int size ;
} ;int main()
{ Name Obj1( "ZhangSan" ) ;Name Obj2 = Obj1 ;		// 调用复制构造函数 Name Obj3( "NoName" ) ;Obj3 = Obj2 = Obj1 ;		// 调用重载赋值运算符函数 
}
Name::Name ( char  *pN ){ cout <<" Constructing " << pN << endl ;pName = new char[ strlen( pN ) + 1 ] ;if( pName != 0 ) strcpy( pName,pN ) ;size = strlen( pN ) ;}
Name::Name( const Name & Obj )	 //复制构造函数
{ cout << " Copying " << Obj.pName << " into its own block\n";pName = new char[strlen( Obj.pName ) + 1 ] ;if ( pName != 0 ) strcpy( pName, Obj.pName ) ;size = Obj.size;
}
Name & Name::operator= ( const Name & Obj )	 // 重载赋值运算符
{ delete  []pName ;//释放内存pName = new char[ strlen( Obj.pName ) + 1 ] ;if ( pName != 0 ) strcpy( pName , Obj.pName ) ;size = Obj.size ;return *this ;
}
Name::~ Name()
{ cout << " Destructing " << pName << endl ;delete  []pName ;size = 0;
}

3.重载运算符[]和()

①前提
  • 运算符 [] 和 () 是二元运算符
  • [] 和 () 只能用成员函数重载,不能用友元函数重载
②重载下标运算符 []

[] 运算符用于访问数据对象的元素

重载格式 类型 类 :: operator[] ( 类型 ) ;

#include<iostream>
using namespace std;
class  vector
{ public :vector ( int  n )  {  v = new  int [ n ] ; size = n ; }~ vector ( )  { delete [ ] v ; size = 0 ; }int & operator [ ] ( int  i )  {  return  v [ i ] ; }//返回为引用,以便修改private :       int * v ;       int size ;
};
int main ( )
{  vector  a ( 5 ) ;a [ 2 ] = 12 ;	  cout << a [ 2 ] << endl ;
}
③重载函数调用符 ()

() 运算符用于函数调用

重载格式 类型 类 :: operator() ( 参数表 ) ;

#include <iostream>
using namespace std ;
class  F{ public :  double  operator ( )  ( double x ,  double  y ) ;} ;
double  F :: operator ( )  ( double  x ,  double  y ){ return   x * x + y * y ; }
int main ( )			
{ F  f  ;cout << f ( 5.2 , 2.5 ) << endl ;
}
④重载流插入和流提取运算符
a.前提
  • istream 和 ostream 是 C++ 的预定义流类
  • cin 是 istream 的对象,cout 是 ostream 的对象
  • 运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
  • 运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
  • 用友元函数重载 << 和 >> ,输出和输入用户自定义的数据类型
include<iostream>
#include<cstdlib>
using namespace std;
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 ;
};
int 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 ;
}
vector::vector( int size ) 
{ if (size <= 0 || size > 100 ){ cout << "The size of " << size << " is null !\n" ; exit( 0 ) ;  }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" ;  exit( 0 ) ;
}
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 ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python连接MariaDB数据库

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;【持续更新最新版】-CSDN博客 Python连接MariaDB数据库 一、安装mariadb库 pip install mariadb 二、连接…

机器视觉学习(六)—— 图像的颜色识别

目录 一、色彩空间 1.1 RGB色彩空间 1.2 HSV色彩空间 1.3 灰度 1.4 CMYK色彩空间 1.5 Lab色彩空间 二、色彩空间转换 三、识别颜色 3.1 识别一种特定的颜色 3.2 识别多种颜色 一、色彩空间 计算机视觉中常用的色彩空间有RGB色彩空间、HSV色彩空间、CMYK色彩空间、La…

34-Java传输对象模式 ( Transfer Object Pattern )

Java传输对象模式 实现范例 传输对象模式&#xff08;Transfer Object Pattern&#xff09;用于从客户端向服务器一次性传递带有多个属性的数据传输对象也被称为数值对象&#xff0c;没有任何行为传输对象是一个具有 getter/setter 方法的简单的 POJO 类&#xff0c;它是可序列…

解锁AI之门:协助探索Amazon Bedrock服务

AI愈加强大的功能和广泛的应用场景&#xff0c;正逐渐改变着我们的工作和生活方式。 Amazon Bedrock在AI的时代潮流中&#xff0c;也以其强大而灵活的功能特性&#xff0c;正在成为越来越多企业和个人的智能助手。 亚马逊云科技通过VERYCLOUD睿鸿股份的服务能力&#xff0c;使…

揭秘!自定义三维模型如何在RflySim中实现仿真(一)

一.技术背景 在无人系统研发过程中&#xff0c;需要进行大量的运动控制系统半物理实时仿真实验&#xff0c;传统仿真界面的运动轨迹显示多采用的是二维曲线形式&#xff0c;运动过程和状态是通过文本数据显示。随着数据量的增加&#xff0c;该方式缺乏直观性&#xff0c;不易观…

前端UI怎么防止用户反复提交?

方法1&#xff1a;禁用按钮 用户点击“xxx”按钮后&#xff0c;先禁用按钮&#xff0c;防止用户多次点击&#xff1b;待请求完成后&#xff0c;再解禁按钮。 方法2&#xff1a;防抖&#xff08;Debouncing&#xff09; 防抖是一种技术&#xff0c;它可以延迟执行函数&#xff0…

python四川火锅文化网站的设计与实现flask-django-php-nodejs

四川火锅文化网站的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;…

蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按

一、题目要求 在CT107D单片机综合训练平台上&#xff0c;通过I/O模式编写代码&#xff0c;实现以下功能&#xff1a; 系统上电后&#xff0c;关闭蜂鸣器、继电器和全部指示灯&#xff0c;数码管显示初始值为28&#xff0c;仅显示数码管最右边两位。利用定时器0实现10ms间隔定…

预测一下,GPT-5 会在什么时候发布,又会有哪些更新?

发布预期&#xff1a;GPT-5预计将于11月发布&#xff0c;可能与ChatGPT发布两周年同期。竞争态势&#xff1a;谷歌的Gemini与GPT-4 turbo已展开竞争。逐步发布&#xff1a;GPT-5可能通过模型训练过程中的中间检查点逐步发布。训练与安全测试&#xff1a;实际训练可能需3个月&am…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…

【IC设计】Verilog线性序列机点灯案例(四)(小梅哥课程)

文章目录 该系列目录&#xff1a;设计环境设计目标设计思路RTL及Testbench代码RTL代码Testbenchxdc约束 仿真结果 声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 该系列目录&#xff1a; Verilog线性…

力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II&#xff0c;53. 最大子数组和&#xff0c;54. 螺旋矩阵&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 52. N 皇后 II 解题思路 完整代码 Python Java 53. 最大子数组…

长安链开源社区发布2023年度长安链优秀应用案例

1月27日结束的“长安链发布三周年庆暨生态年会”上&#xff0c;在国家区块链技术创新中心的指导下&#xff0c;长安链开源社区联合长安链生态联盟正式发布2023年度长安链行业示范案例、领域精品案例及特色创新案例。 本次评选面向2023年度应用长安链上线并取得应用成效的案例&…

Matlab在高光谱遥感中的作用:从数据处理到决策支持

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

vue中如何实现子组件相互切换,而且数据不会丢失

项目场景&#xff1a; 今天的项目场景: 项目为数据报表,但是一个父页面中有很多的子页面,而且子页面中不是相互关联,但是数据又有联系. 问题描述 子页面相互切换的时候之前填写好的数据会丢失,无法保存.这样想提交所有的子页面的数据就出现问题. 原因分析&#xff1a; 分析原因…

TypeScript的接口、泛型、自定义类型

接口 src/types/index.ts //定义一个接口&#xff0c;用于限制person对象的具体属性 export interface PersonInter {id: string,name: string,age: number } src/components/person.vue <template><div class"person"></div> </template&g…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

ONNX @riscv+OpenKylin(暂时失败)

先说总结&#xff1a; 目前在算能云riscvOpenKylin没有成功&#xff0c;看近期是否有人成功&#xff0c;学习下先进经验。 荔枝派应该是很容易成功的&#xff0c;直接用这个库里的whl安装即可&#xff1a;Releases zhangwm-pt/onnxruntime GitHub 安装onnxruntime-riscv …

SpringCloud详解,图文码笔记

注意&#xff1a; SpringCloud并 不等于 微服务 1.微服务技术线 2.认识微服务 分布式架构 分布式架构: 根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立项目开发&#xff0c;称为一个服务。 优点&#xff1a; 降低服务耦合有利于服务升级拓展 服务治理 分布式…

基于Java的绩效考核系统的设计与实现

今天要和大家聊的是一款基于Java的绩效考核系统的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介…